2011-12-05 54 views
1

它是如何訪問null可爲空的索引HasValue
我看着編譯的代碼,它不是一個語法糖。'。'運算符爲空可空

爲什麼這不會引發的NullReferenceException:

int? x = null; 
if (x.HasValue) 
{...} 

回答

11

這是因爲int?是短期的Nullable<int>這是值類型,不是引用類型 - 所以你永遠不會得到NullReferenceException

Nullable<T>結構看起來是這樣的:

public struct Nullable<T> where T : struct 
{ 
    private readonly T value; 
    private readonly bool hasValue; 
    //.. 
} 

當分配null有編譯器一些魔術的支持發生(它知道Nullable<T>和對待他們特別以這種方式),這只是設置hasValue字段在此實例中爲false - 然後由HasValue屬性返回。

+0

此外,struct從未分配null。 –

1

Like BrokenGlass說,一個int?實際上是一個Nullable<T>

結構總是包含一個值。通常你不能將一個結構變量設置爲null,但在這種特殊情況下,你可以將它設置爲default(Nullable<T>)。這將其內容設置爲空而不是變量本身。

當您設置一個Nullable<T>的值,它使用一個隱含的操作者設置Value = value新值和HasValue = true

當您將Nullable<T>設置爲空時,它會將所有結構的字段設爲空。對於bool字段,如HasValue,null == false

由於Nullable<T>變量是一個結構,變量總是可以被引用,因爲它的內容是空的而不是變量本身。

在MSDN頁面struct的備註部分有關於結構的更多信息。

+1

「將結構變量設置爲null將其內容設置爲null,而不是變量本身。」這是錯誤的 - 您不能將null賦值給值類型/結構 - 除了'Nullable '外,編譯器將會適當地將其轉換爲將'hasValue'字段設置爲false。這是唯一可能的,因爲編譯器知道'Nullable ',因此是「魔術」評論。 – BrokenGlass

+0

@BrokenGlass,你說得對。我習慣VB.Net,目前在教自己的C#。在VB中,你可以指定'Dim x As SomeStructure = Nothing'。我猜這與'SomeStructure x = default(SomeStructure)',而不是'SomeStructure x = null'是一樣的。 –

+0

@ Hand-E-Food,那麼爲什麼不更新你的答案到C#(+ VB)? – gdoron