myNullableLong.HasValue和myNullableLong!= null是否有区别?

例如,当我有一个可空的长度时,是否有任何区别

myNullableLong.HasValue 

 myNullableLong != null 

…还是仅仅是“语法糖”?

这只是句法糖。 他们将以完全相同的方式执行 – 无效testing实际上被编译到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>实际上是一个struct ,所以它实际上不能为null ; 编译器将调用比较为null调用(如第二个示例)调用HasValue

请注意,将Nullable<T>装入object将导致T (如果有值)或null (如果不是)的值。

IE

 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 

没有。

C#编译器内置了对Nullable<T>支持,并会将涉及null相等操作转换为对结构成员的调用。

n != nulln.HasValue都会编译成相同的IL。