看看C# 6.0中那些语法糖都干了些什么(上篇)
一:自己主動初始化屬性
???? 確實這個比之前的版本號簡化了一下。只是你肯定非常好奇。究竟編譯器給我們做了哪些東西呢?
1 class Student 2 { 3 public string Name { get; set; } = "ctrip"; 4 }
?
從這張圖中能夠看到,在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 set 13 { 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 set 13 { 14 k__BackingField = value; 15 } 16 } 17 18 public Student() 19 { 20 k__BackingField = "ctrip"; 21 } 22 }?
不好意思,一不小心就扯到了變量初始化和構造函數賦值在源碼級別的差別。
?
二:僅僅讀屬性初始化
這個也是一個超級好玩的屬性,先來看看代碼:
1 class Student 2 { 3 public string Name { get; } 4 5 public Student(string name) 6 { 7 Name = name; 8 } 9 }可是我們記得,在之前的C#版本號是不能這么寫。但如今惹不住好奇心,先去底層看看究竟生成了什么。
?
?
然后我就奇怪了,屬性本來就能夠是僅僅讀的,如今編譯器已經放開了,那是不是有問題了,我假設真的是須要一個僅僅讀屬性。這個該怎樣是好
呢?然后我就試著在Name屬性中返回一個值,果然編譯器不放行。這就說明編譯器在里面還做了一個貌似合理的推斷。
?
三:Lambda充當函數體
這個聽起來就有點怪怪的,還是先看個樣例。
1 class Student 2 { 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充當函數體的語法糖僅僅適合一條語句。假設真要做到多條語句。那你僅僅能單獨提取一個方法出來。
就像以下這樣。
轉載于:https://www.cnblogs.com/wzzkaifa/p/7242919.html
總結
以上是生活随笔為你收集整理的看看C# 6.0中那些语法糖都干了些什么(上篇)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习(四)决策树
- 下一篇: Python自动化开发课堂笔记【Day1