2011-03-08 98 views

回答

53

這只是語法糖。它們的行爲方式完全相同 - 無論如何,無效測試實際上都被編譯爲調用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 
+0

哪兩個你會認爲'整潔'? – 2011-03-08 14:36:48

+2

@尼爾:這取決於上下文。我可能會*通常*使用空比較,但偶爾我猜'HasValue'會更具可讀性。 – 2011-03-08 14:38:29

+2

謝謝。我不得不說,我看到更多'!= null'比我做HasValue'比較。 – 2011-03-08 14:39:33

8

這句法糖; 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 
+1

請參閱http://msdn.microsoft.com/en-us/library/ms228597.aspx – 2014-02-04 12:58:06

3

C#編譯器已經內置了支持Nullable<T>和會變成涉及到null呼叫結構體的成員平等的行動。

n != nulln.HasValue都將編譯成相同的IL。

相關問題