Если у меня есть длина с нулевым значением, например, существует ли разница между
myNullableLong.HasValue
и
myNullableLong != null
... или это просто "синтаксический сахар"?
Если у меня есть длина с нулевым значением, например, существует ли разница между
myNullableLong.HasValue
и
myNullableLong != null
... или это просто "синтаксический сахар"?
Это просто синтаксический сахар. Они будут вести себя точно так же - тест на недействительность в любом случае скомпилируется в призыв к HasValue
.
Пример:
public class Test
{
static void Main()
{
int? x = 0;
bool y = x.HasValue;
bool z = x != null;
}
}
IL:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 25 (0x19)
.maxstack 2
.locals init (valuetype [mscorlib]System.Nullable`1<int32> V_0)
IL_0000: ldloca.s V_0
IL_0002: ldc.i4.0
IL_0003: call instance void valuetype [mscorlib]System.Nullable`1<int32>::.ctor(!0)
IL_0008: ldloca.s V_0
IL_000a: call instance bool valuetype [mscorlib]System.Nullable`1<int32>::get_HasValue()
IL_000f: pop
IL_0010: ldloca.s V_0
IL_0012: call instance bool valuetype [mscorlib]System.Nullable`1<int32>::get_HasValue()
IL_0017: pop
IL_0018: ret
} // end of method Test::Main
Синтаксический сахар; Nullable<T>
на самом деле a struct
, поэтому он фактически не может быть null
; компилятор обращается к вызовам, которые сравниваются с null
(как ваш второй пример) с вызовами HasValue
.
Обратите внимание, что бокс a Nullable<T>
в object
приведет либо к значению T
(если оно имеет значение), либо null
(если это не так).
т.е.
int? foo = 10; // Nullable<int> with a value of 10 and HasValue = true
int? bar = null; // Nullable<int> with a value of 0 and HasValue = false
object fooObj = foo; // boxes the int 10
object barObj = bar; // boxes null
Console.WriteLine(fooObj.GetType()) // System.Int32
Console.WriteLine(barObj.GetType()) // NullReferenceException
Нет.
Компилятор С# имеет встроенную поддержку Nullable<T>
и превратит операции равенства с null
в вызовы членам структуры.
n != null
и n.HasValue
будут скомпилированы для идентичного IL.