C 6 0的語法《二》

2021-06-28 04:14:39 字數 1875 閱讀 8782

一:字串嵌入值

1

class

bird2"

, name);8}

9 }

這個format有乙個不好的地方就是,如果佔位符太多,就特別容易搞錯,如果你少了乙個引數,**就會報錯。

因為容易報錯,所以為了保險起見就用字串拼接的方式來實現,但是我也知道字串拼接是耗時的一種操作,寫個stringbuilder又嫌麻煩,

還好c#6.0中提供了一種新鮮玩法,先看**:

1

class

bird

2", name);89

var result = "

\:\";10

11console.writeline(result);12}

13 }

然後就迫不及待的去看看底層怎麼玩的,其實在下面的il圖中可以看到,在底層最終還是呼叫了string.format方法來實現的。

二:using靜態類

這種寫法看起來有點不倫不類的,乍一看也沒有什麼用處,不過可以告訴我們乙個原理,就是不管你上層怎麼變,編譯器還是一樣使用

全命名,這就叫萬變不離其宗吧。

三:空值判斷

先還是來看看這種玩法的真容。

1

class

bird

27 }

是不是看著有點眼暈?那就對了,編譯器就是這樣靜靜的端著碗看著我們寫這些裝逼的**,不過再怎麼裝逼,也逃不過ildasm的眼睛。

其實仔細看il**之後,覺得一切還是那麼的熟悉,重點就是這個brtrue.s。它的狀態也決定了兩條執行流,不過在il上面也看到了v_1這個編譯

器給我們單獨定義的乙個變數,**還原如下:

1

class

bird213

else

1417

}18 }

四:nameof表示式

當我知道這個關鍵字的用途時,我的第一反應就是公司框架裡面的logmanager類,當我們new logmanager的時候,會同時把當前的類名

傳遞下去,然後做些後期處理,但是在以前我們只能這麼做,要麼用反射,要麼寫死。

我想大家也能看到,第一種使用了反射,這是需要讀取元資料的,效能***,第二個雖然是字串,你也看到了,是寫死的方式,這個時候就

急需乙個加強版,就像下面這樣。

C 6 0的語法《一》

一 自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?從這張圖中可以看到,在ctor中k backingfield ctrip 的賦值在base ctor之前,這就說明name是變數初始化賦值,而不屬於 建構函式賦值,那有什麼區別呢,如果base ct...

C 6 0 新特性 二

有過正確實現結構經驗的所有 net 開發人員無疑都為乙個問題所困擾 需要使用多少語法才能使型別固定不變 為 net 標準建議的型別 此問題實際上是唯讀屬性存在的問題 定義為唯讀的支援字段 建構函式內支援欄位的初始化 屬性的顯式實現 而非使用自動屬性 返回支援欄位的顯式 getter 實現 所有這一切...

C 6 0新增功能

c 6.0 版本包含許多可提高開發人員工作效率的功能。此版本中的功能包括 自動屬性初始值設定項 expression bodied 函式成員 using static null 條件運算子 字串內插 異常篩選器 nameof 表示式 catch 和 finally 塊中的 await 索引初始值設定...