[翻譯] C# 8.0 預覽


原文: C# 8.0 Previewed

在一個Channel 9 的視頻中,Mads Torgersen展示了C#8的首批四個新特性。

可空引用類型

過去我們報道過可空引用類型,簡單地說,默認情況下引用類型將不再能為空。相應的,您必須使用與可空值類型相同的 Type? 語法將其明確標記為可空。

將 null 分配給不可為空的引用類型將得到一個編譯器警告。 同樣,從可空類型讀取也將得到一個編譯器警告,除非提前對有問題的變量進行顯式檢查。 所以理論上開發者需要做的唯一改變是適當情況下加上問號。

自從我們的報告,這個特性添加了一個新的語法。 考慮一種情況,你明知道可空變量x實際上不是空值,但卻無法編譯器證明。 在這種情況下,可以使用 x!.Method() 來禁止編譯器對潛在空引用異常的警告。

異步流 (即 foreach async)

異步流類似於 IEnumerable 的異步方式。 正如我們之前報道的,異步流是自2015年以來一直在努力推進的事。經過多次討論,最終確定的語法是:

foreach await (string s in asyncStream)

使用下面的方法簽名來定義一個異步迭代器

async IAsyncEnumerable<T> MethodName()

與普通的 IEnumberable 方法一樣,你可以使用 yield return 來懶式的構建一個對象流。

與Reactive Extensions庫里的IObservable 相比,這個方案的好處是消費者可以控制流量。這被稱為“拉模型”,而IObservable 是一種“推模型”,這意味着生產者可以向消費者提供比它所能處理的更高的流量來消耗消費者。

默認接口實現

默認接口實現本質上是一種有限的多重繼承形式。 這將允許抽象接口完全定義方法,就像抽象類一樣。 然而,抽象接口仍然無法聲明構造方法或字段。

注意:你可以使用 ConditionalWeakTable 模擬在接口上的字段。

默認接口實現的主要好處是,你可以向現有的接口添加新的方法而不破壞向后兼容性。 但是這不能保證,因為只有當一個合適的默認方法被設計出來時,它才會起作用。

這是一個非常有爭議的功能。 我們不會在這里重復這些討論,但可以在早期關於默認接口實現的文章中閱讀相關總結。

擴展一切

一項對C#的長期抱怨是只可以編寫擴展方法,但不能擴展屬性。 事實上,在當前模式下都沒有辦法定義擴展屬性或事件。 另外,將擴展方法放在靜態類中對許多人來說感覺很奇怪。

在新設計下,有一個新的頂級結構稱為“擴展”。 例如,如果要為 Customer 類創建擴展方法和屬性,你可以寫:

extension CustomerExt extends Customer { //methods and properties go here }

與接口一樣,你不能在擴展中定義實例字段,但可以使用ConditionalWeakTable來模擬它們。 你還可以定義靜態字段。

除了屬性,事件和操作符重載之外,甚至正在考慮允許擴展構造方法。 擴展構造方法在工廠和對象池方案中將非常有趣。

擴展接口

擴展接口,將新接口添加到現有類的能力,也在考慮之中。不過這不會是一個 C# 8 的功能,因為它需要更改底層運行時。

有關C#的未來的更多信息,請查看C#語言設計倉庫。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM