回答
我嘗試用C++來explan它:
在C++中的整數,布爾......被直接分配到內存中,所以如果你創建它僅使用四個字節的值的整數變量。如果你想創建一個可爲空的整數變量,你必須創建一個指向存儲該值的內存的指針,所以如果指針爲空(0x0),它將指向任何內容。如果它不爲空,它指向整數的實際值。
如果你想添加兩個整數,你可以用一個彙編指令來完成它,因爲這些值可以直接傳遞給處理器。
這可以轉移到C#/ Java的字節碼。原語可以直接由C#/ Java-Virtual Machine使用。所有其他變量不能直接使用,它們必須由編譯器「取消引用」。
因爲它們不能保持空值它們不是對象只有對象可以保留空值它們有自己的默認值的原始類型例如:
char hold'\ u0000'作爲它的默認值,但是如果你想用一個空值,你應該使用字類,而這是一個單個字符實例的容器... :) 我希望這將幫助你:)
我認爲OP是知道的,他問爲什麼 –
正如你引述
null關鍵字是表示nu的文字參考,不涉及任何對象。 null是引用類型變量的默認值。
不像對象原語持有數據,而不是引用。由於基元沒有機會參與其中,所以null
對它們沒有任何意義。
值類型是結構..他們只能保存值。例如,int在c#中存儲1,2等。我們不能通過創建對象來引用它們。
當它被認爲是字符串或任何類...它們可以被引用。如果它具有null意味着不引用任何東西..
最後,我想說的值類型存儲值和對象存儲值的參考:)
的null
價值點什麼都沒有,所以這是一個(不存在)的參考。在Java中,Object
是引用類型,因此對象類型值可以包含空值(例如,Integer
)。另一方面,基元是值類型而不是引用類型,因此它們不能是null
。
的Java的設計,因爲性能方面的考慮這種方式。使用引用比使用值更慢,消耗內存更多。
因爲類型例如像整型,布爾等都是值類型他們必須初始化後,有一定的價值。
在C#如果初始化INT那樣(不分配任何值):
int someInt;
在默認分配值0。變量必須有一個特定的值。
在引用類型像對象的字符串或實例:
string someString;
SomeClass someObject;
在默認分配空;
- 1. 爲什麼Object []可以存儲基元?
- 2. 爲什麼「」不是空的?
- 3. 什麼是UI基元
- 4. 爲什麼在C#中比較可空和不可空int?
- 5. 爲什麼kafka是基於pull而不是基於push的?
- 6. 爲什麼`request.files`是空的?
- 7. 爲什麼我MultipartFile是空
- 8. COMPOSER_HOME爲什麼是空的?
- 9. 爲什麼request.body是空的?
- 10. 爲什麼TextView.text是空的
- 11. 爲什麼我的元素爲空?
- 12. State Monad,爲什麼不是元組?
- 13. XML-to-JSON:什麼是基本元素?什麼是財產?
- 14. mysql UPDATE說列不能爲空。爲什麼它是空的?
- 15. 爲什麼java不打破空格不是空白字符?
- 16. 什麼是使主鍵可爲空號與非空的
- 17. 休眠列表爲空或空......可能是什麼原因
- 18. 爲什麼這個CalendarView是空的(什麼都不顯示)?
- 19. 什麼是'不可驗證的代碼',爲什麼它不好?
- 20. 外鍵可爲空。爲什麼需要?
- 21. 爲什麼不是ODBCConnection.State可靠?
- 22. 爲什麼JavaScript NodeList是不可變的?
- 23. 爲什麼FindWindow()不是100%可靠?
- 24. 爲什麼大部分從localeconv基本上都是空的?
- 25. XML,這是什麼:null或空元素?
- 26. 什麼是空xml元素用於?
- 27. 爲什麼不是包含兩個空列表的元組是一個空元組?
- 28. 可編輯的gridview - 什麼是基礎?
- 29. 爲什麼可空類型的行爲是這樣
- 30. 不可空值轉換爲可空類型的基本知識
由於性能cosideration.In C#nullables的是結構和在Java中包裝類(整數)是引用類型。 –
如果您不明白變量是什麼以及CPU指令的C#語言抽象程度有多高,這是一個很好的問題。 – Sinatr