2010-01-28 41 views
12

我想要一個整數變量,可以設置爲空,不希望使用int? myVariable語法。我嘗試使用intInt16無濟於事。我必須使用int? myVariable嗎?什麼是C#中的整數引用類型?

我提到過這個,因爲在Java中同時存在'int'類型(原語)和'Integer'(引用類型)。我想確保沒有可以使用的內置整數引用類型。我會用'int?'爲了我在做什麼。

+5

...爲什麼你不想使用該語法? – womp 2010-01-28 06:31:29

+3

@Jon,這就像......我希望編譯器知道它,而不用我說出來。 – Dykam 2010-01-28 06:33:57

回答

26

有關信息,int?/Nullable<T>不是參考型;它只是一個「可空類型」,意思是:具有特殊編譯器規則(重新空檢查,運算符等)和CLI規則(用於裝箱/拆箱)的結構(實質上是intbool標誌)。有在.NET中沒有「整數引用類型」,除非你把拳擊:

int i = 123; 
object o = i; // box 

但這帶來不必要的對象,有很多相關的其他問題。

對於你想要的,int?應該是理想的。你可能使用長期的語法(Nullable<int>),但IMO這是不必要的冗長,我已經看到它混淆了人。

+4

恕我直言_?_混淆取決於背景 - 它混淆了紅寶石的人。我們使用空值它googlable和msdnable :)爲新手 – 2010-01-28 07:09:51

+0

你將如何處理你有一個IDictionary 的情況下,讓我們說你用作爲各種對象的計數。代碼「theDictionary [someObject] = newValue」不起作用,因爲索引器調用(「[..]」)的返回值不是對字典的KeyValuePair 實例中存儲的同一個值的對象引用。要增加計數器,您必須刪除KVP並重新添加它以將任何新值寫入KVP?或者有其他方法嗎? – Marchy 2011-06-27 05:22:30

+1

@Marchy'theDictionary [someObject] = newValue'會正常工作;即分配給索引器,該索引器已定義良好並得到完全支持 – 2011-06-27 05:34:57

2

是的,這是唯一的方法,因爲Int32/Int16/int是一個基本類型(不管這些是裝箱/拆箱)。

8

是的,你應該使用可空類型

Nullable

Nullable<int> Nullable<float> 

或者乾脆

int? float? 

PS:

如果你不想使用符號或Nullable - 只需使用特殊的結構來完成這樣的事情。例如DataTable

var table = new DataTable(); 
table.Columns.Add('intCol',typeof(int)); 
var row = table.NewRow(); 
row['intCol'] = null; // 
+0

請注意,這不是一個引用類型,因爲您的鏈接(「表示可以分配空值的值類型」)。但它確實回答了OP的潛在問題,如果不是標題中的問題。 – Kat 2015-08-10 20:29:38

0

<var>?語法使得空。如果你深入瞭解一下,你會發現它只是一個被使用的通用對象。

如果你想像C++那樣做,你必須使用不安全的操作。然後,像C中的指針可用,但是您的代碼不符合CLR ...

對於使用純淨的無指針的.NET,?是要走的路。

+5

它不是一個對象,Nullable是一個結構體。 – 2010-01-28 06:38:51

0

是的。這就是微軟補充說的原因。人們正在創建自己的Nullable類,因此他們在.NET中包含了這種模式。

0

如果你討厭?這麼多,你可以使用System.Nullable<int>

0

你將不得不使用可空類型,即:

Nullable<int> or int? 

可空類型的目的是,使您將null分配給值類型。

從MSDN:

可空類型地址,你希望能夠有一個基本類型與空(或未知)值的情況。這在數據庫場景中很常見,但在其他情況下也很有用。

在過去,有這樣幾種方式:

  1. 裝箱值類型。這在編譯時不是強類型的,並且涉及爲每個類型分配一個堆。
  2. 值類型的類包裝器。這是強類型的,但仍然涉及堆分配,並且您必須編寫包裝器。
  3. 支持空性概念的結構包裝器。這是一個很好的解決方案,但你必須自己寫。
相關問題