當我有一個可爲空長,例如,有myNullableLong.HasValue和myNullableLong!= null之間是否有區別?
myNullableLong.HasValue
和
myNullableLong != null
之間的區別...或只是「語法糖」?
當我有一個可爲空長,例如,有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
哪兩個你會認爲'整潔'? – 2011-03-08 14:36:48
@尼爾:這取決於上下文。我可能會*通常*使用空比較,但偶爾我猜'HasValue'會更具可讀性。 – 2011-03-08 14:38:29
謝謝。我不得不說,我看到更多'!= null'比我做HasValue'比較。 – 2011-03-08 14:39:33
這句法糖; Nullable<T>
實際上是struct
,所以它實際上不能是null
;編譯器將與null
(如第二個示例)相比較的調用轉換爲調用HasValue
。
注意,雖然,拳擊一個Nullable<T>
爲object
將導致T
任一值(如果有值)或null
(如果事實並非如此)。
I.E.
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
請參閱http://msdn.microsoft.com/en-us/library/ms228597.aspx – 2014-02-04 12:58:06
號
C#編譯器已經內置了支持Nullable<T>
和會變成涉及到null
呼叫結構體的成員平等的行動。
n != null
和n.HasValue
都將編譯成相同的IL。
看到這[相似的問題](http://stackoverflow.com/questions/676078/which-is-preferred-nullable-hasvalue-or-nullable-null) – DOK 2013-02-27 20:07:06