2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超4個(gè)贊
該語(yǔ)言允許空引用類型的(可能)原因是什么?
有時(shí)你想要一些沒(méi)有價(jià)值的東西。例如,考慮具有父子關(guān)系的節(jié)點(diǎn)類。如果Parent
永遠(yuǎn)不能為空,那將是非常不愉快的。即使在 C++ 中,指針也可以指向“無(wú)”,如0
.
我如何在我編寫(xiě)的代碼中處理這個(gè)問(wèn)題?
從第一天起這就是一個(gè)問(wèn)題。C# 團(tuán)隊(duì)一直希望我們作為開(kāi)發(fā)人員通過(guò)進(jìn)行足夠的空檢查來(lái)“修復(fù)”這個(gè)問(wèn)題。這就是我們一直在做的事情。
現(xiàn)在,在 C# 8(仍在開(kāi)發(fā)中)有可以為null 的引用類型。啟用后,如果將可能不為 null 的變量分配為 null 或可能為 null,您將收到編譯器錯(cuò)誤。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果我們把問(wèn)題反過(guò)來(lái)...
由于您來(lái)自 C++,我們可以問(wèn)“C++ 如何擺脫不能為空的引用”。簡(jiǎn)單的答案是“好吧,它有空指針,所以它不需要空引用”。有兩種不同類型的變量來(lái)表示對(duì)對(duì)象的引用(具有非常不同的規(guī)則和語(yǔ)法)使 C++變得更加簡(jiǎn)單。
是的,Tony Hoare聲稱空引用是他的“數(shù)十億美元的錯(cuò)誤”。但是,如果您無(wú)法表示未分配的引用,則很難使用簡(jiǎn)單的語(yǔ)法獲得可工作的 C 系列語(yǔ)言。
考慮這個(gè)簡(jiǎn)單的 C# 代碼:
string myString;
if (condition) {
myString = func1();
} else {
mystring = func2();
}
UseTheString(myString);
字符串變量必須在外部作用域中聲明。如果每個(gè)引用變量都需要在聲明時(shí)初始化(如 C++ 引用),那么您需要使用一些會(huì)被丟棄幾行的東西來(lái)初始化它。是的,你可能會(huì)說(shuō),這就是為什么string.Empty。比 System.String 更復(fù)雜的類型 - 構(gòu)造成本更高的類型呢?他們是否需要都具有unassigned價(jià)值?這已經(jīng)非常接近了null。嘿,JavaScript 有(空值和未賦值)!
C++ 引用非常方便,但它們也很受限制。它們不僅在聲明時(shí)必須被賦值,而且它們也是不可變的(變量 - 而不是它們引用的對(duì)象)。一旦聲明并初始化 C++ 引用,就無(wú)法更改它所引用的內(nèi)容。如果 C# 引用遵循此規(guī)則,則編寫(xiě)下面的代碼會(huì)很有趣(忽略循環(huán)中的字符串連接幾乎總是一個(gè)壞主意的事實(shí)):
string myString = string.Empty;
for (var i = 0; i < someValue; ++i) {
myString = myString + SomeFunc(i);
}
然后,需要考慮一些自然為空的內(nèi)容,例如關(guān)系數(shù)據(jù)庫(kù)中可為空的內(nèi)容??煽罩殿愋?( Nullable<T>) 出現(xiàn)在框架的第一個(gè)主要發(fā)布 v1 版本中也就不足為奇了。我們很多人都記得(我們中的一些人仍然在應(yīng)付) DbNull 類型(和值)的痛苦。
是的,處理空值是一種痛苦。大多數(shù)(但不是全部)語(yǔ)言中都有它。C# 語(yǔ)言(引用類型和值類型的組合共享一個(gè)變量語(yǔ)法)比 C++ 更容易閱讀/理解/挑選。我發(fā)現(xiàn)我在 C# 中編寫(xiě)的錯(cuò)誤比作為 C++ 程序員少得多(不過(guò),在最近對(duì)語(yǔ)言進(jìn)行所有更改之前,我是 90 年代的 C++ 程序員)。
C# 8.0 人員認(rèn)為他們有一個(gè)解決方案(這不是一個(gè)完整的解決方案,但它應(yīng)該使空引用異常更加罕見(jiàn))。我很好奇您對(duì) C# 如何避免 Hoare 博士的十億美元錯(cuò)誤的看法。
- 2 回答
- 0 關(guān)注
- 199 瀏覽
添加回答
舉報(bào)