日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 7.1先睹为快(第一部分)

發(fā)布時間:2023/12/4 C# 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 7.1先睹为快(第一部分) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

異步Main函數(shù)

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

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

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

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

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

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

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

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

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

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

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

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

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

我們是否正在挑起類型之爭?

一個使用默認(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

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

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

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

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

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

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

在C#中,開發(fā)人員可能常會有這樣的一個疑問:“null是否表示的是實(shí)際的空值,或是表示了可能為空值也可能不為空值的默認(rèn)值?”我們認(rèn)為,這是一個令人非常困惑的問題。

在本文的第二部分中,我們將介紹元組和模式匹配。

原文地址:http://www.infoq.com/cn/news/2017/06/CSharp-7.1-a


.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關(guān)注

總結(jié)

以上是生活随笔為你收集整理的C# 7.1先睹为快(第一部分)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。