C# 8 新增小功能
盡管 C# 8 應該會在今年發布,并且 C# 8.x 和 9 的路線圖也開始形成,但是,微軟正在繼續審查下一個版本的特性。
目標類型表達式
假設我們有 A、B 和 C 三種類型,其中類型 B 和 C 是類型 A 的子類型。如果我們使用如下所示的語句,那么,編譯器無法確定右側要返回的類型。
A a1 = b ?? cA a2 = x>0 ? b : cA a3 = a switch {B b => b,C c => c,_ => throw new System.Exception()}通常情況下,修復該問題需要添加強制轉換,如:
A a1 = b ?? c;A a2 = x>0 ? b : c;根據目標類型switch表達式提議,在每種情況下都允許編譯器使用語句(A a1)的左側來決定右側(b ??c)應該返回的類型。該功能還可以用于返回語句(return b ??c),但不能用于變量(var a1 = b ??c)。
目前,這個(例 3)的模式匹配版本計劃于 C# 8.0 中提供,其他兩個則于 8.x 中提供。
允許在解構中使用“default”
根據該提議,這個小功能將允許在初始化元組時使用 default 關鍵字:
(int i, string s) = default;(i, s) = default;過時的屬性
與 Visual Basic 不同,C# 無法把單個 getter 和 setter 標記為過時。相反,只能將屬性作為整體做這樣的標記。該提議糾正了這種情況。為了理解這個問題的重要性,請看看 Cory Nelson 的評論。
就在幾個星期前,我試圖清理一些大量使用 get/set 屬性的代碼,使其成為一個更加只讀的初始化的構造函數(ctor-initialized),此時我發現我真希望該特性是這樣的。
4 月,該特性從 C# 9 遷移到了 C# 8 上。
結構上的只讀成員
當分配給只讀字段或用作 in 參數時,結構上的方法有個性能小問題。如果我們調用結構上的方法,編譯器首先會生成防御性副本。盡管這通常不足以產生問題,但是,在用于緊密循環(tight loop)時,細微的低效的確會累積出性能問題。
對于完全不可變的結構,可以標記整個結構為只讀,這樣可以避免此類情況的發生。然而,出于性能的緣故,很多結構是可變的。
根據只讀示例方法提議,開發人員將能夠把單個方法標記為只讀。這向編譯器表明,防御性副本不是必要的,沒有值會被修改。
這和Pure 屬性不同,只要只讀方法不修改結構本身的值,那么就有明顯的副作用。
自動實現屬性的 getter 將被自動認為是只讀的。在某些情況下,setter 也可以被標記為只讀。比如,當屬性值存于字典中而不是直接存入結構本身的時候。
在目前的提議下,引用類型(類和接口)將不會受到該特性的支持。原因有三重:
這么做,沒有與性能相關的優勢
只讀關鍵字不意味著狀態不會改變,只是不會直接修改對象上的字段。
這是只讀結構的擴展,沒有等效的只讀類。
原文地址:https://www.infoq.cn/article/H9a_LecLcPwkQoWyTYNf
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的C# 8 新增小功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在 Asp.Net Core WebAP
- 下一篇: C# 默认接口方法更新完成,很多细节问题