可能重複:
What's the difference between 'int?' and 'int' in C#?int的解釋? VS INT
我遇到在C#中的一些代碼,變量聲明爲:int? number
什麼是?
的含義及如何做這不同於:int
可能重複:
What's the difference between 'int?' and 'int' in C#?int的解釋? VS INT
我遇到在C#中的一些代碼,變量聲明爲:int? number
什麼是?
的含義及如何做這不同於:int
int
不能是null
。
int?
是Nullable<int>
結構的別名,您可以將其設置爲null
。
它是句法編譯器糖爲Nullable<int>
基本上你的數字(或任何其他值類型)可以爲空以及它的值。您使用HasValue屬性檢查值。它們可以被轉換爲它們的值類型(雖然如果它們爲空將會失敗)或者可以使用Value屬性(如果它爲空,它將會拋出異常)
有一件事通常看起來被忽視當使用可空類型時,GetValueOrDefault()方法在對象爲null時返回默認值(T)。
正如@Kyle Trauberman在評論中指出的那樣,您確實可以將其與null進行比較而不是檢查HasValue。該類型本身是一個帶有overriden等價方法的值類型,因此就像它永遠不會是null本身一樣,如果它沒有值,它將返回true,如果與null相比,它將返回true。
您也可以使用正常的'值== null'檢查,而不是'HasValue'。 –
聲明背後的問號意味着該變量可以爲空。
int?
是Nullable<int>
的簡寫,它允許您假裝整數可以處理空值。
int? foo = null;
與數據庫列允許空項打交道時,這是指示缺乏價值,你會之前已經在過去使用的魔法值(-1)是有用的,也是有益的。
對於準深入瞭解,一個Nullable<T>
(引入在.NET 2.0)是一個簡單的包裝在一個值類型T
暴露兩個屬性,HasValue
和Value
,其中HasValue
是一個布爾值,表示如果該值已經設置並且Value
(顯然是足夠的)返回值。如果HasValue
爲假,則訪問Value
是錯誤的。因此,要訪問Value
,首先檢查HasValue
是一種很好的方式。此外,如果您只是想將任何非值歸一化爲默認值(數字類型爲0),則可以使用方法GetValueOrDefault()
,而無需檢查HasValue
。
注意,雖然你似乎設置foo
到null
,這是在正常使用情況下不會實際上空。 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。
int?可以爲null,因爲int不能。
參考空類型: http://msdn.microsoft.com/en-us/library/1t3y8s4s(v=VS.100).aspx
int?
是用於創建通用System.Nullable<T>
結構類型的實例的簡寫。它允許你讓你的變量爲空。請記住,鑑於<ValueType>?
語法速記,你可以這樣聲明變量:
Nullable<int> i = 10;
請注意'int?'也是*值類型雖然...它與第一句的「定義」矛盾...... –
我仍然不同意你的第一句話,因爲'int?'是一個值類型用空值。然後你會談論一個「對象」爲空 - 而一個*對象*永遠不爲空,只有一個引用是...而且值類型值不是一個對象。 –
你不能設置int?爲null,但你可以給它賦予:) –