原文: 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
默認接口實現
默認接口實現本質上是一種有限的多重繼承形式。 這將允許抽象接口完全定義方法,就像抽象類一樣。 然而,抽象接口仍然無法聲明構造方法或字段。
注意:你可以使用 ConditionalWeakTable 模擬在接口上的字段。
默認接口實現的主要好處是,你可以向現有的接口添加新的方法而不破壞向后兼容性。 但是這不能保證,因為只有當一個合適的默認方法被設計出來時,它才會起作用。
這是一個非常有爭議的功能。 我們不會在這里重復這些討論,但可以在早期關於默認接口實現的文章中閱讀相關總結。
擴展一切
一項對C#的長期抱怨是只可以編寫擴展方法,但不能擴展屬性。 事實上,在當前模式下都沒有辦法定義擴展屬性或事件。 另外,將擴展方法放在靜態類中對許多人來說感覺很奇怪。
在新設計下,有一個新的頂級結構稱為“擴展”。 例如,如果要為 Customer 類創建擴展方法和屬性,你可以寫:
extension CustomerExt extends Customer { //methods and properties go here }
與接口一樣,你不能在擴展中定義實例字段,但可以使用ConditionalWeakTable來模擬它們。 你還可以定義靜態字段。
除了屬性,事件和操作符重載之外,甚至正在考慮允許擴展構造方法。 擴展構造方法在工廠和對象池方案中將非常有趣。
擴展接口
擴展接口,將新接口添加到現有類的能力,也在考慮之中。不過這不會是一個 C# 8 的功能,因為它需要更改底層運行時。
有關C#的未來的更多信息,請查看C#語言設計倉庫。