可空的引用型別(nullable reference types)
可空的引用型別可概括地表述為,引用型別將不再預設可空。因此,開發人員必須使用定義可空值型別的同樣語法「type?」,顯式地標記乙個引用型別為可空。
如果將乙個空值賦值給乙個非可空的引用型別,那麼將會給出乙個編譯器警告。與之相類似,從可空型別中讀取也會給出編譯器警告,除非顯式地提前檢查了被質疑的變數是否為空值。因此從理論上講,開發人員需要做的唯一更改就是在**的適當位置標上問號。
該特性新加了乙個語法。該語法針對開發人員明知乙個可空變數x並非實際為空值卻無法證明給編譯器的情況。在上述情況下,開發人員現在可以定義x!.method(),消除編譯器對於潛在空值引用異常的警告。
非同步流(async streams),即foreach async
非同步流是ieumerable的非同步等價類。c#團隊自2015以來就一直在努力實現非同步流。在經歷了很多爭議後,其語法被定為:
foreach await (string s in asyncstream)開發人員將使用如下的函式簽名定義乙個非同步迭代器:
async iasyncenumerable methodname()就像使用乙個正常的ienumerable方法一樣,開發人員可以使用「yield return」以懶方式(lazy)構建物件流。
相比於源自響應式擴充套件(reactive extensions)的iobservable,使用這一方法的優點在於讓消費者控制流速,這被稱為「pull模式」。與之相對,iobservable是一種「push模式」,這意味著生產者可以使用高於消費者所能處理的流速讓流湧向消費者。
預設介面實現(default inte***ce implementations)
預設介面實現在本質上是一種有限形式的多重繼承。它允許抽象介面像抽象類一樣,對方法進行完全的定義,只是抽象介面依然不能定義建構函式和字段。
需注意,開發人員可以通過使用conditionalweaktable在介面上模擬字段。
預設介面實現的主要好處是,開發人員可以在不破壞向後相容的條件下,將乙個新方法新增到乙個已有的介面中。但是這並非是***的,因為預設介面只是在可以設計出適合的預設方法時才能工作。
擴充套件(extension)
開發人員可以編寫擴充套件方法,但是不能擴充套件屬性,這是長期以來對c#一直存在的乙個問題。事實上,如果使用當前的模式,甚至是不能定義乙個擴充套件屬性或事件的。此外,在很多開發人員看來,在靜態類中放置擴充套件方法是「很詭異的」。
新的設計中新給出了一種稱為「擴充套件」(extension)的頂層語言構件。例如,如果開發人員想要為自定義的customer類建立乙個擴充套件方法和屬性,可編寫如下**:
extension customerext extends customer就介面而言,是不能在擴充套件中定義例項欄位的,但是可以使用conditionalweaktable實現模擬。定義靜態欄位也是允許的。
除了對屬性、事件和操作符過載的擴充套件,c#團隊甚至考慮允許擴充套件建構函式。擴充套件建構函式非常適用於工廠模式(factory)和物件池場景。
擴充套件介面(extension inte***ces)c#團隊還考慮了擴充套件介面,即在已有類中新增新介面的能力。但是擴充套件介面將不會成為c# 8中的特性,因為它需要更改底層的執行時。
C 8 0 的新特性概覽和講解
本文 注意事項 一些想法 參考文獻 該文章的最新版本已遷移至個人部落格 位元飛 單擊鏈結 訪問。2018年11月12日微軟在 msdn 部落格的 building c 8.01 一文發表了新的 c 8.0 即將發布的特性,現在讓我們來看一下。可空引用型別 非同步流範圍和下標型別 介面成員的預設實現 ...
C 8 0的三個值得關注的新特性
本文翻譯自 c 語言是在2000發布的,至今已正式發布了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,c 每個版本的發布都與同時期的 visual studio 以及 net 執行時版本高度耦合,這也有助於開發者更好的學習掌握 c 並將其與 visual studio 以及 net...
C 8 0的三個值得關注的新特性
c 語言是在2000發布的,至今已正式發布了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,c 每個版本的發布都與同時期的 visual studio 以及 net 執行時版本高度耦合,這也有助於開發者更好的學習掌握 c 並將其與 visual studio 以及 net 的使用結合...