2011-09-22 34 views
-1

可能重複:
Which is preferred: Nullable<>.HasValue or Nullable<> == null?安全並正確地從Nullable中提取價值?

我在使用以下兩種形式的「安全地」獲取值出可空類型的代碼庫工作。例如,如果foo是可空(INT):

if (foo != null) { 
    value = (int)foo; 
} 

if (foo.HasValue) { 
    value = foo.Value; 
} 

我傾向於第二種形式,但沒有任何特殊背景下這可能使第一(或第二,對於這個問題),在肯定首選其他?

回答

3

第一和第二等價恰好,並編譯下至同一IL。

編輯:他們確實產生相同的IL,就像這樣:

IL_000b: ldloca.s V_1 
    IL_000d: call  instance bool valuetype 
          [mscorlib]System.Nullable`1<int32>::get_HasValue() 
    IL_0012: ldc.i4.0 
    IL_0013: ceq 
    IL_0015: stloc.2 
    IL_0016: ldloc.2 
    IL_0017: brtrue.s IL_0023 
    IL_0019: nop 
    IL_001a: ldloca.s V_1 
    IL_001c: call  instance !0 valuetype 
          [mscorlib]System.Nullable`1<int32>::get_Value() 
    IL_0021: stloc.0 

這是由C#4規格(或其他版本的等效)第7.10.9保證。

基本上 - 無論使用哪構成您和您的團隊找到更具可讀性。

Anton突出顯示了null-coalescing operator - 雖然Anton的代碼與您的代碼不相同,但您確實應該熟悉這個操作符,因爲它確實可以製作出漂亮的代碼。

+0

是的,如果編譯器符合規範(版本3.0第7.9.9節「相等運算符和空值」),那麼它*是*保證編譯器將使用Value屬性。 – phoog

+0

@phoog:很好。它是C#4規範中的第7.10.9節。將編輯。 –

1

我個人比較喜歡

var value = foo ?? 0; 
+0

這是不一樣的,雖然 - 這將改變value'的'值*即使'foo'是null',這是不符合的問題的代碼的情況。 –

+0

也許是這樣,喬恩,但你會得到,如果'你使用它之前value'未初始化編譯錯誤,所以還不如讓被它初始化像安東的默認值的代碼更易讀使用空合併運算符已建議''??。 – FMM

2

我傾向於使用第二種形式,因爲它代表着什麼可空其實是 - 有兩個成員結構。