国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

看看C# 6.0中那些語法糖都干了些什么(上篇)

2019-11-17 02:41:50
字體:
來源:轉載
供稿:網友

看看C# 6.0中那些語法糖都干了些什么(上篇)

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

一:自動初始化屬性

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

1     class Student2     {3         public string Name { get; set; } = "ctr

從這張圖中可以看到,在ctor中<Name>k__backingfield=“ctrip“的賦值在base::ctor之前,這就說明name是變量初始化賦值,而不屬于

構造函數賦值,那有什么區別呢,如果base::ctor在<Name>k__backingfield=”ctrip"之前,那就是構造函數賦值了,不過我得特別要指明

一下,是源代碼級別的區別,而不是IL中的區別,因為在IL中都是構造函數賦值,不過語句順序不一樣而已,然后我把內部做的代碼復原如下:

 1     class Student 2     { 3         private string k__BackingField = "ctrip"; 4  5         public string Name 6         { 7             get 8             { 9                 return k__BackingField;10             }11 12             set13             {14                 k__BackingField = value;15             }16         }17     }

然后再看看怎么讓base::ctor在<Name>k__backingfield="ctrip"之前。

 1     class Student 2     { 3         private string k__BackingField; 4  5         public string Name 6         { 7             get 8             { 9                 return k__BackingField;10             }11 12             set13             {14                 k__BackingField = value;15             }16         }17 18         public Student()19         {20             k__BackingField = "ctrip";21         }22     }

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

二:只讀屬性初始化

  這個也是一個超級好玩的屬性,先來看看代碼:

1     class Student2     {3         public string Name { get; }4 5         public Student(string name)6         {7             Name = name;8         }9     }

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

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

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

三:Lambda充當函數體

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

1     class Student2     {3         public string Name => "ctrip";4 5         public void Print(string name) => Console.WriteLine(name);6     }

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

看看IL在底層都做了些什么?

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

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

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

就像下面這樣。

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 航空| 克拉玛依市| 黔江区| 武强县| 凤凰县| 五华县| 集安市| 师宗县| 体育| 大余县| 长白| 宝山区| 鹤壁市| 贵港市| 揭东县| 澄江县| 郑州市| 嵩明县| 嘉鱼县| 澄城县| 湛江市| 丽水市| 盖州市| 文登市| 特克斯县| 田东县| 百色市| 收藏| 鄢陵县| 宜宾市| 临沭县| 长治市| 新晃| 周至县| 九寨沟县| 岢岚县| 平昌县| 栾城县| 友谊县| 梁山县| 祁阳县|