Запустите это, чтобы увидеть, что int?
является типом значения:
class Program
{
static int? nullInt;
static void Main(string[] args)
{
nullInt = 2;
Console.WriteLine(string.Format("{0} + 3 != {1}", nullInt, DoMath(nullInt , 3).ToString()));
Console.WriteLine(string.Format("{0} * 3 = {1}" , nullInt , DoMultiply(nullInt , 3).ToString()));
nullInt = null;
Console.WriteLine(string.Format("{0} + 3 != {1}" , nullInt , DoMath(nullInt , 3).ToString()));
Console.WriteLine(string.Format("{0} * 3 = {1}" , nullInt , DoMultiply(nullInt , 3).ToString()));
Console.ReadLine();
}
static int? DoMath(int? x , int y)
{
if (x.HasValue)
{
return (++x) + y;
}
else
return y;
}
static int DoMultiply(int? x , int y)
{
if (x.HasValue)
{
return (int)x * y;
}
else
return 0;
}
}
Я считаю, что это очень интересно и подходит для умного использования.
То, что ?
делает, это создает пустую ссылку на тип значения, не равный нулю. Это как указатель, который можно проверить - HasValue
(логическое значение)? Приятной особенностью Nullable< T >
является то, что свойство Value
не нужно приводить к его исходному типу - эта работа выполняется для вас внутри обнуляемой структуры.