它是如何訪問null可爲空的索引HasValue
?
我看着編譯的代碼,它不是一個語法糖。'。'運算符爲空可空
爲什麼這不會引發的NullReferenceException:
int? x = null;
if (x.HasValue)
{...}
它是如何訪問null可爲空的索引HasValue
?
我看着編譯的代碼,它不是一個語法糖。'。'運算符爲空可空
爲什麼這不會引發的NullReferenceException:
int? x = null;
if (x.HasValue)
{...}
這是因爲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
屬性返回。
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的備註部分有關於結構的更多信息。
「將結構變量設置爲null將其內容設置爲null,而不是變量本身。」這是錯誤的 - 您不能將null賦值給值類型/結構 - 除了'Nullable
@BrokenGlass,你說得對。我習慣VB.Net,目前在教自己的C#。在VB中,你可以指定'Dim x As SomeStructure = Nothing'。我猜這與'SomeStructure x = default(SomeStructure)',而不是'SomeStructure x = null'是一樣的。 –
@ Hand-E-Food,那麼爲什麼不更新你的答案到C#(+ VB)? – gdoron
此外,struct從未分配null。 –