C 8 新增小功能

2021-09-24 18:44:43 字數 1211 閱讀 4072

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

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

 複製**

aa1=b?? c;

aa2= x>0?b: c;

aa3= aswitch;

通常情況下,修復該問題需要新增強制轉換,如:

 複製**

a a1=(a)b ??(a)c;

a a2= x>0?(a)b :(a)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 的子型別。如果我們使用如下所示的語句,那麼,編譯器無法確定右側要返回的型別。a a1 b ca a2 x 0 ...

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...