C 6 0的語法《一》

2021-06-28 01:26:40 字數 1952 閱讀 3329

一、自動初始化屬性:

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

從這張圖中可以看到,在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的語法《二》

一 字串嵌入值 1 class bird2 name 8 9 這個format有乙個不好的地方就是,如果佔位符太多,就特別容易搞錯,如果你少了乙個引數,就會報錯。因為容易報錯,所以為了保險起見就用字串拼接的方式來實現,但是我也知道字串拼接是耗時的一種操作,寫個stringbuilder又嫌麻煩,還好...

c 6 0新特性(一)

接近年底了,基本上沒什麼活了,就學點新東西,就想著了解下c 6.0的新特性。在code project上看到了一篇不錯的文章,就準備翻譯一下,順便照著學習學習。廢話不多說,直奔主題。眾所周知,c 6.0 是在visual studio 2015中引入的。在其他的幾個版本中同樣引入一些特性,比如在c ...

c 6 0新特性(一)

接近年底了,基本上沒什麼活了,就學點新東西,就想著了解下c 6.0的新特性。在code project上看到了一篇不錯的文章,就準備翻譯一下,順便照著學習學習。廢話不多說,直奔主題。眾所周知,c 6.0 是在visual studio 2015中引入的。在其他的幾個版本中同樣引入一些特性,比如在c ...