2015-10-14 44 views
4

我想知道爲什麼基元不能爲空。爲什麼不是基元可空

今天我讀this

空關鍵字是表示一個空引用,一個不指向任何對象文字。 null是引用類型變量的默認值。普通值類型不能爲空。但是,C#2.0引入了可以爲空的值類型。請參見可空類型(C#編程指南)。

所以我知道有可空原語像在C#int?Integer Java編寫,但爲什麼沒有廉政局或布爾的直接等可空?

這個問題並不針對任何編程語言,但是編程語言中爲什麼不允許原語爲空是不同的?

+0

由於性能cosideration.In C#nullables的是結構和在Java中包裝類(整數)是引用類型。 –

+1

如果您不明白變量是什麼以及CPU指令的C#語言抽象程度有多高,這是一個很好的問題。 – Sinatr

回答

4

我嘗試用C++來explan它:

在C++中的整數,布爾......被直接分配到內存中,所以如果你創建它僅使用四個字節的值的整數變量。如果你想創建一個可爲空的整數變量,你必須創建一個指向存儲該值的內存的指針,所以如果指針爲空(0x0),它將指向任何內容。如果它不爲空,它指向整數的實際值。

如果你想添加兩個整數,你可以用一個彙編指令來完成它,因爲這些值可以直接傳遞給處理器。

這可以轉移到C#/ Java的字節碼。原語可以直接由C#/ Java-Virtual Machine使用。所有其他變量不能直接使用,它們必須由編譯器「取消引用」。

0

因爲它們不能保持空值它們不是對象只有對象可以保留空值它們有自己的默認值的原始類型例如:
char hold'\ u0000'作爲它的默認值,但是如果你想用一個空值,你應該使用類,而這是一個單個字符實例的容器... :) 我希望這將幫助你:)

+1

我認爲OP是知道的,他問爲什麼 –

4

正如你引述

null關鍵字是表示nu的文字參考,不涉及任何對象。 null是引用類型變量的默認值。

不像對象原語持有數據,而不是引用。由於基元沒有機會參與其中,所以null對它們沒有任何意義。

0

值類型是結構..他們只能保存值。例如,int在c#中存儲1,2等。我們不能通過創建對象來引用它們。

當它被認爲是字符串或任何類...它們可以被引用。如果它具有null意味着不引用任何東西..

最後,我想說的值類型存儲值和對象存儲值的參考:)

6

null價值什麼都沒有,所以這是一個(不存在)的參考。在Java中,Object是引用類型,因此對象類型值可以包含空值(例如,Integer)。另一方面,基元是值類型而不是引用類型,因此它們不能是null

的Java的設計,因爲性能方面的考慮這種方式。使用引用比使用值更慢,消耗內存更多。

0

因爲類型例如像整型,布爾等都是值類型他們必須初始化後,有一定的價值。

在C#如果初始化INT那樣(不分配任何值):

int someInt; 

在默認分配值0。變量必須有一個特定的值。

引用類型像對象的字符串或實例:

string someString; 
SomeClass someObject; 

在默認分配;