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 aint? x1 = condition ? a : nullint? bdouble cdouble? x2 = condition ? b : c在推斷數組類型或 lambda 表達式的返回類型時,也支持這種改進。
聲明表達式
基于 C 語言的一個特性是賦值是表達式,而不僅僅是語句。這允許了諸如 a=b=c=0 的快捷賦值方式,但也允許了諸如 if(a=false)的錯誤。因此,許多設計指南都禁止在另一個語句中修改變量。
C# 一直在相反的方向上發展,它能夠在諸如輸出參數等新的地方定義變量,并作為模式匹配的一部分。使用聲明表達式,我們幾乎可以在任何可以執行賦值的地方聲明變量。
以前你需要寫如下的代碼,
char chwhile ((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 中提出的,它將允許在新定義某些(而不是全部)變量時進行多重賦值。
本地函數改進
本地函數的一個限制是它們不能應用屬性(這只是 C# 的一個限制;CLR 允許這樣做)。在 C# 8 中,它可能引起問題的原因是,可能需要諸如 NotNullWhenTrue 之類的屬性來為可空性檢查獲取正確的語義。
再比如,使用本地函數的屬性可以更方便地配置 ASP.NET 的路由。
總結
以上是生活随笔為你收集整理的C# 8.x 先睹为快的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET Core Web API
- 下一篇: NuGet是什么?理解与使用