Подтвердить что ты не робот

Есть ли разница между myNullableLong.HasValue и myNullableLong!= Null?

Если у меня есть длина с нулевым значением, например, существует ли разница между

myNullableLong.HasValue 

и

myNullableLong != null

... или это просто "синтаксический сахар"?

4b9b3361

Ответ 1

Это просто синтаксический сахар. Они будут вести себя точно так же - тест на недействительность в любом случае скомпилируется в призыв к 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

Ответ 2

Синтаксический сахар; 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

Ответ 3

Нет.

Компилятор С# имеет встроенную поддержку Nullable<T> и превратит операции равенства с null в вызовы членам структуры.

n != null и n.HasValue будут скомпилированы для идентичного IL.