第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

引用類型超出 null 的基本原理

引用類型超出 null 的基本原理

C#
繁華開(kāi)滿天機(jī) 2021-12-25 18:35:40
我是來(lái)自 C++ 背景的語(yǔ)言的新手,我很難理解允許引用類型為空的原因。考慮以下片段class Person {  private string _name;  public Person(string name) {_name = name;}  void print() {    Console.WriteLine(_name);  }}現(xiàn)在沒(méi)有什么可以阻止調(diào)用者執(zhí)行以下操作Person p = new Person(null);p.print();這會(huì)崩潰,如果 null 傳遞給構(gòu)造函數(shù),我可以通過(guò)拋出異常來(lái)保護(hù)它(不是真的),但這只是意味著如果它沒(méi)有被捕獲(我不能在 C# 中強(qiáng)制執(zhí)行 AFAIK),我會(huì)在第一行崩潰,而不是第二行。調(diào)用者必須閱讀文檔(這意味著我不能忘記記錄構(gòu)造函數(shù)可能拋出的內(nèi)容)以了解所有這些。該語(yǔ)言允許空引用類型的(可能)原因是什么?這什么時(shí)候是有利的,而不僅僅是一個(gè)滴答作響的定時(shí)炸彈?我能想到的一種情況是延遲初始化,想要有條件地分配一個(gè)對(duì)象。我如何在我編寫(xiě)的代碼中處理這個(gè)問(wèn)題?
查看完整描述

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ò)誤。


查看完整回答
反對(duì) 回復(fù) 2021-12-25
?
30秒到達(dá)戰(zhàn)場(chǎng)

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ò)誤的看法。


查看完整回答
反對(duì) 回復(fù) 2021-12-25
  • 2 回答
  • 0 關(guān)注
  • 199 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)