看看C 6 0中那些語法糖都幹了些什麼(中篇)

2021-09-07 08:13:23 字數 2138 閱讀 5917

接著上篇繼續扯,其實語法糖也不是什麼壞事,第乙個就是吃不吃隨你,第二個就是最好要知道這些糖在底層都做了些什麼,不過有一點

叫眼見為實,這樣才能安心的使用,一口氣上五樓,不費勁。

一:字串嵌入值

1     class bird

2 ", name);

8 }

9 }

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

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

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

1     class bird

2 ", name);

8 9 var result = "\:\";

10 11 console.writeline(result);

12 }

13 }

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

二:using靜態類

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

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

三:空值判斷

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

1     class bird

2

7 }

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

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

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

1     class bird

2

13 else

14

17 }

18 }

四:nameof表示式

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

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

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

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

看到il後,反正我是雞動了。。。nameof具有上面兩者的優點,既靈活,效能又高。。。。不錯不錯,贊一下。

看看C 6 0中那些語法糖都幹了些什麼(中篇)

一 字串嵌入值 我想string.format方法就是化成灰大家都認識,比如下面 1 class bird2 name 8 9 這個format有乙個不好的地方就是,如果佔位符太多,就特別容易搞錯,如果你少了乙個引數,就會報錯。因為容易報錯,所以為了保險起見就用字串拼接的方式來實現,但是我也知道字串...

看看C 6 0中那些語法糖都幹了些什麼(上篇)

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的il?一 自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?從這張圖中可以看到,在ctor中k backingfield ct...

看看C 6 0中那些語法糖都幹了些什麼(上篇)

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的il?一 自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?從這張圖中可以看到,在ctor中k backingfield ct...