亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

從反編譯的角度去觀察C#6.0

2019-11-14 13:57:38
字體:
來源:轉載
供稿:網友

1. 自動屬性初始化 (Initializers for auto-PRoperties)

1.1 C#6.0 之前的寫法

public class FirstExperience{   private string _stringAutoProp = "自動初始化屬性";   public string StringAutoProp   {      get{ return _stringAutoProp; }      set{ _stringAutoProp = value; }   }}

1.2 C#6.0 中的寫法

public class FirstExperience{   public string StringAutoProp { get; set; } = "自動初始化屬性";}

1.3 反編譯效果


從反編譯中我們發現多了個私有字段this.<StringAutoProp>k__BackingField;并在默認的構造函數中將“自動初始化屬性”賦值給了這個字段,那么可以推斷出IL中肯定會有這個匿名字段的定義,讓我們再來看看IL中的體現:

用上面的兩張圖我們可以得出以下結論

其實自動初始化屬性就是在CLR中體現就是創建私有的匿名字段,然后在構造函數中為這個匿名屬性賦值,而屬性的getSet方法其實就是在操作這個匿名屬性。

2. 只讀屬性的初始化(Getter-only auto-properties)

2.1 C#6.0 之前的寫法

public FirstExperience(int id){    _id = id;}private readonly int _id;public int ID{    get { return _id; }}

2.2 C#6.0 中的寫法

public int ReadonlyProp { get; }public FirstExperience(int _readonlyProp){    ReadonlyProp = _readonlyProp;}

2.3 反編譯效果


從反編譯的結果我們看到構造函數中將傳進來的_readonlyProp賦值給this.<ReadonlyProp>k__BackingField字段,而屬性的get方法操作的就是這個由編譯器生成的字段,而在ReadonlyProp屬性的get方法中打了CompilerGenerated這個特性標簽,這個標簽其實就是區分編譯器生成的元素與用戶生成的元素,關于這個特性請移步到此。由此可以推斷IL中所做的操作與自動初始化屬性一致

3. 用Lambda作為函數體 (Expression bodies on method-like members)

3.1 C# 6.0 之前的寫法

 public override string ToString(){    return string.Format("{0}",StringAutoProp);}

3.2 C# 6.0 寫法

public override string ToString() => string.Format("{0}", StringAutoProp);

在6.0 語法中我們看到可以使用lambda表達式直接作為函數體,那么編譯器到底為我們做了什么呢?

3.3 反編譯效果

從反編譯中我們可以看出編譯器編譯的時候把lambda函數直接編譯成方法體,那么再看看IL的區別了。

從上面兩張圖中可以看出除了標注堆棧標注刻度不同以外,看不出有什么差別。我也不是太明白這個地方,求園內的大牛解釋解釋!

4. 空值判斷 (Null-conditional Operators)

4.1 惡心的寫法

if(xxx !=null){    xxx.ToString();}

這種寫法相信有非常多的朋友用過,經常為了一個是否為空的問題搞得代碼非常難看,
舉個栗子:我們需要獲取集合或者是字符喘的長度

if(parem!=null){    return parem.Length;}return null;

這樣的寫法實在太惡心了,在6.0語法中我們可以這么寫

public int? GetListCount(List<int> list){    return list?.Count();}

4.2 實際應用的栗子

在實際應用中,經常會用到委托,而在之前我們需要調用委托時則需要判斷委托是否為空如下代碼:

public void Test(TestNew test){    if (test != null)    {        test.Invoke();    }}

對于強迫癥的我來說這樣太惡心了,于是乎利用6.0的語法開始改造

public void Test1(TestNew test){    test?.Invoke();}

4.3 根據上面的栗子進行反編譯

從上圖反編譯效果可以看到兩個方法基本沒有差別,接下來看看IL中有什么差別:

上圖為6.0語法委托調用的IL圖,發現核心還是brtrue.s做IF判斷決定執行流

5. nameof表達式 (nameof expressions)

5.1 在實際項目的方法中我們經常需要這樣去做參數判斷

public void MyMethod(string name){    if (string.IsNullOrEmpty(name))    {        throw new ArgumentNullException("name");    }}

上面代碼中的name是我們手寫的字符串,在給參數name改名時經常會忘記改下面的字符串name,然而 6.0 解決了這個問題:

public void MyMethod(string name){    if (string.IsNullOrEmpty(name))    {        throw new ArgumentNullException(nameof(name));    }}

5.2 nameof的反編譯

上圖中nameof(name)被替換成了字符串name,就如同常量一樣。繼續來看看IL做了什么:

從IL中我們可以看到它是直接ldstr,既不是反射也不是拿變量的內存值,在實際運用中有時候我們會通過Type來獲取他的類名或者是直接寫死的但是這樣通過反編譯后會發現Type.Name在IL中其實是通過反射來獲取,而直接寫死的方式,在IL中其實就是定義一個變量到堆棧中然后再引用進去。
nameof(name)具有這兩種的的有點,靈活而且相對于type和寫死的方式性能更高了。

6. 小結

其實6.0中還有很多新的語法糖,在這里就不一一介紹了,等不忙了,我在把其他的新的語法糖寫出來

非常感謝您花時間讀完這篇文章,如果您覺得此文不錯,請點一下“推薦”按鈕,您的“推薦”就是對我最大的鼓勵以及不懈努力的肯定。
本文版權歸作者和博客園所有,來源網址:http://www.49028c.com/Wesley-Zen/歡迎各位轉載,轉載文章之后必須在文章頁面明顯位置給出作者和原文連接,否則保留追究法律責任的權利以及小小的鄙視。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久9| 欧美精品在线免费观看| 日韩视频在线观看免费| 亚洲尤物视频网| 中文字幕少妇一区二区三区| 国产综合视频在线观看| 国产成人精品免高潮费视频| 欧美激情国内偷拍| 国产在线精品一区免费香蕉| 性欧美长视频免费观看不卡| 国产成人午夜视频网址| 日韩av在线网| 最新亚洲国产精品| 丝袜美腿亚洲一区二区| 亚洲伊人久久综合| 中文一区二区视频| 成人精品在线视频| 亚洲变态欧美另类捆绑| 亚洲天堂2020| 国产日韩精品在线播放| 亚洲国产日韩欧美在线99| 国产日韩欧美综合| 一本大道香蕉久在线播放29| 国产精品视频免费在线观看| 日韩最新av在线| 精品视频久久久| 亚洲欧洲视频在线| 色综合伊人色综合网站| 午夜精品一区二区三区在线| 久久国产色av| 久久99青青精品免费观看| 成人亲热视频网站| 国产aⅴ夜夜欢一区二区三区| 日韩在线观看免费| 日韩欧美综合在线视频| 欧美在线视频免费观看| 国产精品国产福利国产秒拍| 大伊人狠狠躁夜夜躁av一区| 黄色一区二区在线观看| 色综合伊人色综合网站| 亚洲女同精品视频| 国产精品久久久久久久久久新婚| 在线观看日韩www视频免费| 日韩精品中文在线观看| 国语自产精品视频在免费| 尤物yw午夜国产精品视频明星| 久久精品视频在线| 国产精品久久久久久久久久久久久| 国产精品第1页| 国产精品第一视频| 国产精品wwww| 亚洲久久久久久久久久| 国产成人欧美在线观看| 97在线精品视频| 日韩精品在线视频观看| 国产美女精品视频| 国产v综合v亚洲欧美久久| 日韩国产精品亚洲а∨天堂免| 欧美国产第一页| 欧美在线一级va免费观看| 日韩欧美在线字幕| 成人午夜黄色影院| 91免费精品视频| 日韩美女激情视频| 国产成人一区二区三区小说| 亚洲精品一区二区三区婷婷月| 最近2019年中文视频免费在线观看| 69视频在线播放| 国产成人综合av| 欧美日韩中国免费专区在线看| 久久色在线播放| 97在线观看视频| xvideos国产精品| 国产精品jvid在线观看蜜臀| 亚洲欧洲高清在线| 91夜夜揉人人捏人人添红杏| 91亚洲精品久久久久久久久久久久| 欧美精品激情blacked18| 高清欧美性猛交xxxx黑人猛交| 精品电影在线观看| 2021久久精品国产99国产精品| 亚洲午夜久久久久久久| 亚洲精品在线看| 欧美亚洲第一区| 91国产中文字幕| 欧美亚洲另类激情另类| 欧美精品国产精品日韩精品| 91免费视频国产| 国产成人精品优优av| 欧美亚洲另类激情另类| 少妇av一区二区三区| 日韩av成人在线| 久久九九热免费视频| 日韩一区视频在线| 欧美午夜精品在线| 国产精品香蕉国产| 日韩精品在线免费观看视频| 自拍偷拍亚洲一区| 宅男66日本亚洲欧美视频| 九色91av视频| 精品视频www| 成人免费看黄网站| 97在线精品国自产拍中文| 伊人久久大香线蕉av一区二区| www.午夜精品| 国产精品爽黄69| 成人福利在线视频| 亚洲国产精品99久久| 欧美精品免费在线| 午夜精品一区二区三区在线| 国产精品免费一区| 日本伊人精品一区二区三区介绍| 亚洲精品丝袜日韩| 成人亚洲激情网| 国产成+人+综合+亚洲欧美丁香花| 日韩av大片免费看| 欧美成年人在线观看| 97视频在线观看成人| 欧美激情网友自拍| 国产精品久久在线观看| 久久久精品中文字幕| 国产精品一区二区久久久| 欧美黄色小视频| 91精品国产色综合久久不卡98口| 精品久久久999| 91av中文字幕| 欧美日韩国产中文精品字幕自在自线| 亚洲国模精品私拍| 国产欧美日韩中文字幕在线| 欧美成人第一页| 国产成人综合av| 日韩在线欧美在线国产在线| 欧美一级片久久久久久久| 热久久美女精品天天吊色| 亚洲欧洲一区二区三区久久| 亚洲精品美女久久| xvideos亚洲| 中文字幕日韩精品在线| 日韩电影中文字幕一区| 欧美高清视频在线播放| 久久久久亚洲精品成人网小说| 欧美日韩在线观看视频小说| 国产精品嫩草影院一区二区| 欧美疯狂做受xxxx高潮| 高清欧美一区二区三区| 久久伊人免费视频| 亚洲欧美制服中文字幕| 精品久久久久久国产| 亚洲xxxx在线| 永久555www成人免费| 91精品国产色综合久久不卡98| 成人激情免费在线| 国产欧美日韩综合精品| 亚洲精品久久久久久久久| www.色综合| 亚洲综合中文字幕68页| 中文字幕亚洲一区二区三区| 亚洲一级免费视频| 亚洲欧美制服丝袜| 国产精品久久久久久av| 日本道色综合久久影院| 国产精品美女免费| 日韩av电影在线播放| 亚洲欧美一区二区精品久久久|