一:字串嵌入值
1這個format有乙個不好的地方就是,如果佔位符太多,就特別容易搞錯,如果你少了乙個引數,**就會報錯。class
bird2"
, name);8}
9 }
因為容易報錯,所以為了保險起見就用字串拼接的方式來實現,但是我也知道字串拼接是耗時的一種操作,寫個stringbuilder又嫌麻煩,
還好c#6.0中提供了一種新鮮玩法,先看**:
1然後就迫不及待的去看看底層怎麼玩的,其實在下面的il圖中可以看到,在底層最終還是呼叫了string.format方法來實現的。class
bird
2", name);89
var result = "
\:\";10
11console.writeline(result);12}
13 }
二:using靜態類
這種寫法看起來有點不倫不類的,乍一看也沒有什麼用處,不過可以告訴我們乙個原理,就是不管你上層怎麼變,編譯器還是一樣使用
全命名,這就叫萬變不離其宗吧。
三:空值判斷
先還是來看看這種玩法的真容。
1是不是看著有點眼暈?那就對了,編譯器就是這樣靜靜的端著碗看著我們寫這些裝逼的**,不過再怎麼裝逼,也逃不過ildasm的眼睛。class
bird
27 }
其實仔細看il**之後,覺得一切還是那麼的熟悉,重點就是這個brtrue.s。它的狀態也決定了兩條執行流,不過在il上面也看到了v_1這個編譯
器給我們單獨定義的乙個變數,**還原如下:
1四:nameof表示式class
bird213
else
1417
}18 }
當我知道這個關鍵字的用途時,我的第一反應就是公司框架裡面的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 索引初始值設定...