2011-06-17 70 views

回答

16

int不能是null

int?Nullable<int>結構的別名,您可以將其設置爲null

+7

請注意'int?'也是*值類型雖然...它與第一句的「定義」矛盾...... –

+0

我仍然不同意你的第一句話,因爲'int?'是一個值類型用空值。然後你會談論一個「對象」爲空 - 而一個*對象*永遠不爲空,只有一個引用是...而且值類型值不是一個對象。 –

+0

你不能設置int?爲null,但你可以給它賦予:) –

4

它是句法編譯器糖爲Nullable<int>

基本上你的數字(或任何其他值類型)可以爲空以及它的值。您使用HasValue屬性檢查值。它們可以被轉換爲它們的值類型(雖然如果它們爲空將會失敗)或者可以使用Value屬性(如果它爲空,它將會拋出異常)

有一件事通常看起來被忽視當使用可空類型時,GetValueOrDefault()方法在對象爲null時返回默認值(T)。

正如@Kyle Trauberman在評論中指出的那樣,您確實可以將其與null進行比較而不是檢查HasValue。該類型本身是一個帶有overriden等價方法的值類型,因此就像它永遠不會是null本身一樣,如果它沒有值,它將返回true,如果與null相比,它將返回true。

+0

您也可以使用正常的'值== null'檢查,而不是'HasValue'。 –

3

聲明背後的問號意味着該變量可以爲空。

5

int?Nullable<int>的簡寫,它允許您假裝整數可以處理空值。

int? foo = null; 

與數據庫列允許空項打交道時,這是指示缺乏價值,你會之前已經在過去使用的魔法值(-1)是有用的,也是有益的。

對於準深入瞭解,一個Nullable<T>(引入在.NET 2.0)是一個簡單的包裝在一個值類型T暴露兩個屬性,HasValueValue,其中HasValue是一個布爾值,表示如果該值已經設置並且Value(顯然是足夠的)返回值。如果HasValue爲假,則訪問Value是錯誤的。因此,要訪問Value,首先檢查HasValue是一種很好的方式。此外,如果您只是想將任何非值歸一化爲默認值(數字類型爲0),則可以使用方法GetValueOrDefault(),而無需檢查HasValue

注意,雖然你似乎設置foonull,這是在正常使用情況下不會實際上空。 null只是這種類型的附加語法糖。上面的代碼行轉換爲

Nullable<int> foo = new Nullable<int>(); 

初始化變量以這種方式只需將HasValue屬性設置爲false。

但是,在涉及拳擊的情況下,如果HasValue爲假(否則它將裝箱到T),則該值實際上會設爲空值。注意後果!例如,在:

int? foo = null; 
string bar = foo.ToString(); // this is fine, returns string.Empty 
Type type = foo.GetType(); // blows up! GetType causes the value to box 
          // resulting in a NullReferenceException 

這是一個快速課程。欲瞭解更多信息,請訪問documentation

10

int?是用於創建通用System.Nullable<T>結構類型的實例的簡寫。它允許你讓你的變量爲空。請記住,鑑於<ValueType>?語法速記,你可以這樣聲明變量:

Nullable<int> i = 10;