歡迎光臨
每天分享高質量文章

C# 8 新增小功能

儘管 C# 8 應該會在今年發佈,並且 C# 8.x 和 9 的路線圖也開始形成,但是,微軟正在繼續審查下一個版本的特性。

標的型別運算式

假設我們有 A、B 和 C 三種型別,其中型別 B 和 C 是型別 A 的子型別。如果我們使用如下所示的陳述句,那麼,編譯器無法確定右側要傳回的型別。

A a1 = b ?? c

A a2 = x>0 ? b : c

A 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 也可以被標記為只讀。比如,當屬性值存於字典中而不是直接存入結構本身的時候。

在目前的提議下,取用型別(類和接口)將不會受到該特性的支持。原因有三重:

  • 這麼做,沒有與性能相關的優勢
  • 只讀關鍵字不意味著狀態不會改變,只是不會直接修改物件上的欄位。
  • 這是只讀結構的擴展,沒有等效的只讀類。

已同步到看一看
赞(0)

分享創造快樂