C# 8.x 先睹爲快

儘管 C# 8.0 還需要幾個月的時間才能發佈,但是 C# 8.x 的特性計劃已經開始了。該計劃中的特性有一些是新提出的,而另外一些則是之前在 C# 8 中考慮過的。和往常一樣,這個特性列表仍可能會發生變化。

如之前的一個報告所討論的那樣,Caller Expression Attribute 特性允許函數捕獲用於生成其參數的表達式。它主要用於斷言和自動化測試。

new關鍵字類型推斷(正式名稱爲目標類型“new”表達式),能在通過上下文可以確定類型名稱的情況下減少樣板代碼。

雖然目前對於Defer 聲明 的反對率高達到3:1,但是在 8.x 版本,Defer 聲明仍然在考慮的特性列表中。

NULL增強公共類型

這實際上是兩個需求(#33#881),它使我們在處理可爲空值類型和三元運算符時不再需要添加顯式強制轉換了。在NULL增強公共類型的建議下,將允許如下的使用場景。

int a;
int? x1 = condition ? a : null;


int? b;
double c;
double? x2 = condition ? b : c;

在推斷數組類型或 lambda表達式的返回類型時,也支持這種改進。

聲明表達式

基於C語言的一個特性是賦值是表達式,而不僅僅是語句。這允許了諸如 a=b=c=0 的快捷賦值方式,但也允許了諸如 if(a=false)的錯誤。因此,許多設計指南都禁止在另一個語句中修改變量。

C# 一直在相反的方向上發展,它能夠在諸如輸出參數等新的地方定義變量,並作爲模式匹配的一部分。使用聲明表達式,我們幾乎可以在任何可以執行賦值的地方聲明變量。

以前你需要寫如下的代碼,

char ch;
while ((ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')

現在它可以縮短成如下代碼:

while ((char ch = GetNextChar()) == 'a' || ch == 'b' || ch == 'c')

下面是你可能會寫的另一個示例:

var sum = (var p = GetPoint(); p.X + p.Y);

在解構時混合聲明和變量是一種相關特性的能力。它首次是在C# 7.1 中提出的,它將允許在新定義某些(而不是全部)變量時進行多重賦值。

(x, var y) = e;

本地函數改進

本地函數的一個限制是它們不能應用屬性(這只是 C# 的一個限制;CLR 允許這樣做)。在 C# 8 中,它可能引起問題的原因是,可能需要諸如 NotNullWhenTrue 之類的屬性來爲可空性檢查獲取正確的語義。

再比如,使用本地函數的屬性可以更方便地配置 ASP.NET 的路由

原文鏈接:

Preview of C# 8.x

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章