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

2021-07-29 08:28:07 字數 1973 閱讀 6936

今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的il?

一:自動初始化屬性

確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢?

從這張圖中可以看到,在ctor中k__backingfield=「ctrip「的賦值在base::ctor之前,這就說明name是變數初始化賦值,而不屬於

建構函式賦值,那有什麼區別呢,如果base::ctor在k__backingfield=」ctrip"之前,那就是建構函式賦值了,不過我得特別要指明

一下,是源**級別的區別,而不是il中的區別,因為在il中都是建構函式賦值,不過語句順序不一樣而已,然後我把內部做的**復原如下:

1     classstudent

2 11 12 set 13 16 } 17 }

然後再看看怎麼讓base::ctor在k__backingfield="ctrip"之前。

不好意思,一不小心就扯到了變數初始化和建構函式賦值在源**級別的區別。

二:唯讀屬性初始化

這個也是乙個超級好玩的屬性,先來看看**:

1     classstudent

2 4 5 public student(stringname) 6 9 }

但是我們記得,在之前的c#版本是不能這麼寫,但現在惹不住好奇心,先去底層看看到底生成了什麼。

然後我就奇怪了,屬性本來就可以是唯讀的,現在編譯器已經放開了,那是不是有問題了,我如果真的是需要乙個唯讀屬性,這個該如何是好

呢?然後我就試著在name屬性中返回乙個值,果然編譯器不放行,這就說明編譯器在裡面還做了乙個貌似合理的判斷。

三:lambda充當函式體

這個聽起來就有點怪怪的,還是先看個例子。

1     classstudent

2

不過當我看到這種寫法時,我也是醉了,假如你一年都沒有接觸c#,再回來看時,我想你肯定看不懂這些****了。。。沒辦法,還得繼續

看看il在底層都做了些什麼?

當看到il的時候再次醉了,其實=>僅僅是乙個{}方法體括號而已呀!這不是徒增我們的學習成本麼?然後我就繼續想,這裡的函式體就一條

console.wirteline語句,那我要是灌幾條語句會怎麼樣呢?可以想象肯定是要加括號的,但是我真的加上{}後,編譯器凌亂了。。。

那這個圖就告訴我們,c#6.0的lamaba充當函式體的語法糖只適合一條語句,如果真要做到多條語句,那你只能單獨提取乙個方法出來,

就像下面這樣。

好了,上篇大體就這樣了,時間不早了,先撤了。

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