溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C#7.1有哪些特性

發(fā)布時(shí)間:2021-11-24 13:38:57 來(lái)源:億速云 閱讀:133 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“C#7.1有哪些特性”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C#7.1有哪些特性”吧!

自2003年以來(lái),Microsoft首次考慮對(duì)C#使用帶小數(shù)點(diǎn)后位數(shù)的版本。當(dāng)前暫定下一個(gè)版本是C# 7.1,其中有望包括:異步Main函數(shù)(Async Main)、默認(rèn)表達(dá)式(Default Expression)、推導(dǎo)元組名(Infer Tuple Names)和使用泛型的模式匹配(Pattern-matching with Generics)等。

異步Main函數(shù)

最讓測(cè)試異步代碼的開(kāi)發(fā)人員沮喪的,無(wú)疑是控制臺(tái)應(yīng)用當(dāng)前不支持異步入口點(diǎn)(EntryPoint)。雖然變通方法是編寫(xiě)多行樣板代碼,但是這樣的模式依賴于對(duì)方法的非正常使用,難于理解。例如:

ublic static void Main()
{
    MainAsync().GetAwaiter().GetResult();
}
private static async Task MainAsync()
{
    ... // 程序主代碼。
}

為解決這個(gè)問(wèn)題,在“異步Main函數(shù)建議”中,添加了如下四個(gè)新的函數(shù)簽名,羅列了可能的入口點(diǎn)。

static Task Main()
static TaskMain()
static Task Main(string[])
static TaskMain(string[])

如果代碼中不存在另一個(gè)非異步Main函數(shù),那么只要給出一個(gè)上述的入口點(diǎn)函數(shù),編譯器就會(huì)生成所需的樣板代碼。唯一的限制是需要向后兼容。

Microsoft曾考慮允許“async void Main()”,但是這種做法會(huì)使編譯器更復(fù)雜,并且Microsoft總體上并不鼓勵(lì)在事件處理器之外使用“async void”。

默認(rèn)值(即Nothing)

VB沒(méi)有表示“null”的關(guān)鍵字,這是C#和VB間的一個(gè)微妙的差別。但是VB有一個(gè)關(guān)鍵字“Nothing”。在語(yǔ)言技術(shù)規(guī)范中,對(duì)該關(guān)鍵字給出了如下說(shuō)明:

Nothing是一個(gè)特殊的常值。它沒(méi)有類型,可轉(zhuǎn)換為類型系統(tǒng)中的任意類型,也包括類型參數(shù)。在轉(zhuǎn)換為某個(gè)特定類型后,它等價(jià)于該類型的默認(rèn)值。

C#當(dāng)前使用“default(T)”模式實(shí)現(xiàn)同一效果,但略為繁瑣,尤其是類的名字很長(zhǎng)時(shí)。C# 7.1中將提供一個(gè)“默認(rèn)常值”(Default Literal),其描述為:

這一類型的表達(dá)式可通過(guò)常值轉(zhuǎn)換為默認(rèn)值或null值,隱式地轉(zhuǎn)換為any類型。

該類型向默認(rèn)常值的推理與向null常值推理的工作機(jī)制一樣,除非允許any類型(不只是引用類型)。

在可以使用null的地方,通常也可以使用默認(rèn)常值。這一做法被看成是C#建議中的一個(gè)倒退,可能因?yàn)槿藗兺ǔ?huì)對(duì)兩個(gè)非常類似的方法完成同一件事大皺眉頭。在設(shè)計(jì)會(huì)議紀(jì)要中,就有人提出疑問(wèn):

我們是否正在挑起類型之爭(zhēng)?

一個(gè)使用默認(rèn)常值的例子如下:

ImmutableArrayx = default;
return default;
void Method(ImmutableArrayarrayOpt = default)
var x = new[] { default, ImmutableArray.Create(y) };
const int x = default;
if (x == default)
if (x is default)
y = default as RefType //編譯器告警:總是null。
int i = default

下面例子給出的是對(duì)默認(rèn)常值的非法使用:

const int? y = default;
if (default == default)
if (default is T)
var i = default
throw default

后者無(wú)疑是一個(gè)C#設(shè)計(jì)上的奇特構(gòu)件。在設(shè)計(jì)會(huì)議紀(jì)要中,給出了如下說(shuō)法:

在C#中,允許開(kāi)發(fā)人員拋出null。這會(huì)引發(fā)一個(gè)運(yùn)行時(shí)錯(cuò)誤,進(jìn)而導(dǎo)致拋出一個(gè)NullReferenceException異常。因此,拋出NullReferenceException并非正大光明的,而是一種丑陋的模式。

完全沒(méi)有理由允許拋出默認(rèn)值。我們并不認(rèn)為用戶會(huì)感覺(jué)這是可行的,或是了解它的工作機(jī)制。

Microsoft并未引入默認(rèn)常值,而是考慮通過(guò)擴(kuò)展“null”實(shí)現(xiàn)同一效果。因?yàn)樵赩B中“nothing”和“null”是兩個(gè)不同的關(guān)鍵詞,所以在VB中可以這樣做。即使不使用關(guān)鍵字,VB中也具有null的概念。因此,開(kāi)發(fā)人員可以看到“NothingReferenceException”這樣的異常。

感謝各位的閱讀,以上就是“C#7.1有哪些特性”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C#7.1有哪些特性這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI