C 8 0先睹為快

2021-12-29 19:54:56 字數 1899 閱讀 3744

英文原文:c# 8.0 previewed

在 msdn channel 9 中,mads torgersen 先行通過**展示了c# 8 的四個特性。

可空的引用型別(nullable reference types)

infoq 曾對可空的引用型別做了報道,該理念可概括地表述為,引用型別將不再預設可空。因此,開發人員必須使用定義可空值型別的同樣語法「type?」,顯式地標記乙個引用型別為可空。

如果將乙個空值賦值給乙個非可空的引用型別,那麼將會給出乙個編譯器警告。與之相類似,從可空型別中讀取也會給出編譯器警告,除非顯式地提前檢查了被質疑的變數是否為空值。因此從理論上講,開發人員需要做的唯一更改就是在**的適當位置標上問號。

在 infoq 的報道之後,該特性新加了乙個語法。該語法針對開發人員明知乙個可空變數x並非實際為空值卻無法證明給編譯器的情況。在上述情況下,開發人員現在可以定義x!.method (),消除編譯器對於潛在空值引用異常的告警。

非同步流(async streams),即 foreach async

非同步流是 ieumerable 的非同步等價類。正如 infoq 在前期所報道的,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 在介面上模擬字段。

預設介面實現的主要好處是,開發人員可以在不破壞向後相容的條件下,將乙個新方法新增到乙個已有的介面中。但是這並非是***的,因為預設介面只是在可以設計出適合的預設方法時才能工作。

這是乙個頗具爭議的特性。在此我們不會複述那些支援和反對的爭論內容,對這些爭論的總結,可以參見 infoq 先前對於預設介面實現的一篇文章。

擴充套件(extension)

開發人員可以編寫擴充套件方法,但是不能擴充套件屬性,這是長期以來對 c# 一直存在的乙個抱怨。事實上,如果使用當前的模式,甚至是不能定義乙個擴充套件屬性或事件的。此外,在很多開發人員看來,在靜態類中放置擴充套件方法是「很詭異的」。

新的設計中新給出了一種稱為「擴充套件」(extension)的頂層語言構件。例如,如果開發人員想要為自定義的 customer 類建立乙個擴充套件方法和屬性,可編寫如下**:

extension customerext extends customer{

//定義方法和屬性的**。

就介面而言,是不能在擴充套件中定義例項欄位的,但是可以使用 conditionalweaktable 實現模擬。定義靜態欄位也是允許的。

除了對屬性、事件和操作符過載的擴充套件,c#團隊甚至考慮允許擴充套件建構函式。擴充套件建構函式非常適用於工廠模式(factory)和物件池場景。

擴充套件介面(extension inte***ces)

c#團隊還考慮了擴充套件介面,即在已有類中新增新介面的能力。但是擴充套件介面將不會成為c# 8 中的特性,因為它需要更改底層的執行時。

如想更多地了解 c# 的未來發展,請檢視c# language design repo。

C 8 0先睹為快

可空的引用型別 nullable reference types infoq曾對可空的引用型別做了報道,該理念可概括地表述為,引用型別將不再預設可空。因此,開發人員必須使用定義可空值型別的同樣語法 type?顯式地標記乙個引用型別為可空。如果將乙個空值賦值給乙個非可空的引用型別,那麼將會給出乙個編譯...

C 8 0先睹為快

可空的引用型別 nullable reference types infoq曾對可空的引用型別做了報道,該理念可概括地表述為,引用型別將不再預設可空。因此,開發人員必須使用定義可空值型別的同樣語法 type?顯式地標記乙個引用型別為可空。如果將乙個空值賦值給乙個非可空的引用型別,那麼將會給出乙個編譯...

通訊模組 先睹為快 新一代通訊模組RF1xxC

前言 rfid作為感測層的裝置,資料採集後需要及時傳輸給控制器。通常,rfid的資料通訊協議 3964r protocol 控制器無法直接讀取,就需要通訊模組將其轉換成控制器能理解的通訊協議。這就是通訊模組的重要性。新一代通訊模組 rf1xxc 亮點展示 新一代rfid通訊模組有哪些亮點?no.1 ...