C 8 新增小功能

2021-09-24 19:51:10 字數 1180 閱讀 8023

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

假設我們有 a、b 和 c 三種型別,其中型別 b 和 c 是型別 a 的子型別。如果我們使用如下所示的語句,那麼,編譯器無法確定右側要返回的型別。

a a1 = b ?? ca a2 = x>0 ? b : ca a3 = 	a switch
通常情況下,修復該問題需要新增強制轉換,如:

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 關鍵字:

(int i, string s) = default;(i, s) = default;
就在幾個星期前,我試圖清理一些大量使用 get/set 屬性的**,使其成為乙個更加唯讀的初始化的建構函式(ctor-initialized),此時我發現我真希望該特性是這樣的。

4 月,該特性從 c# 9 遷移到了 c# 8 上。

當分配給唯讀欄位或用作 in 引數時,結構上的方法有個效能小問題。如果我們呼叫結構上的方法,編譯器首先會生成防禦性副本。儘管這通常不足以產生問題,但是,在用於緊密迴圈(tight loop)時,細微的低效的確會累積出效能問題。

對於完全不可變的結構,可以標記整個結構為唯讀,這樣可以避免此類情況的發生。然而,出於效能的緣故,很多結構是可變的。

根據唯讀示例方法提議,開發人員將能夠把單個方法標記為唯讀。這向編譯器表明,防禦性副本不是必要的,沒有值會被修改。

這和pure 屬性不同,只要唯讀方法不修改結構本身的值,那麼就有明顯的***。

自動實現屬性的 getter 將被自動認為是唯讀的。在某些情況下,setter 也可以被標記為唯讀。比如,當屬性值存於字典中而不是直接存入結構本身的時候。

在目前的提議下,引用型別(類和介面)將不會受到該特性的支援。原因有三重:

C 8 新增小功能

儘管 c 8 應該會在今年發布,並且 c 8.x 和 9 的路線圖也開始形成,但是,微軟正在繼續審查下乙個版本的特性。假設我們有 a b 和 c 三種型別,其中型別 b 和 c 是型別 a 的子型別。如果我們使用如下所示的語句,那麼,編譯器無法確定右側要返回的型別。複製 aa1 b?c aa2 x ...

UE4簡單功能 C 小功能

基本思路 通過名字enum名查詢到對應的enum,然後呼叫對應函式,粗暴且效率不高,勝在邏輯簡單。enum轉fstring template forceinline fstring enum2string const fstring name,tenum value return enumptr g...

C 函式實現的小功能集合

子窗體返回主窗體 名稱 redirect 功能 子窗體返回主窗體 引數 url 返回值 空 public void redirect string url,page page 判斷是否為數字 名稱 isnumberic 功能 判斷輸入的是否是數字 引數 string otext 源文字 返回值 bo...