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 != null
和n.HasValue
都会编译成相同的IL。