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

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

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

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

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

  接著上篇繼續扯,其實語法糖也不是什么壞事,第一個就是吃不吃隨你,第二個就是最好要知道這些糖在底層都做了些什么,不過有一點

叫眼見為實,這樣才能安心的使用,一口氣上五樓,不費勁。

一:字符串嵌入值

  我想String.Format方法就是化成灰大家都認識,比如下面代碼:

1     class Bird2     {3         PRivate string Name = "swallow";4 5         public void Fly()6         {7             var result = string.Format("hello {0}", Name);8         }9     }

  這個Format有一個不好的地方就是,如果占位符太多,就特別容易搞錯,如果你少了一個參數,代碼就會報錯。

接下來跟趟順風車,去看看string.Format底層代碼,還是蠻驚訝的發現,其實底層不過調用的就是StirngBuilder.AppendFormat方法。

因為容易報錯,所以為了保險起見就用字符串拼接的方式來實現,但是我也知道字符串拼接是耗時的一種操作,寫個StringBuilder又嫌麻煩,

還好C#6.0中提供了一種新鮮玩法,先看代碼:

 1     class Bird 2     { 3         private string Name = "swallow"; 4  5         public void Fly() 6         { 7             //var result = string.Format("hello {0}{1}", Name); 8  9             var result = "/{"hello"}:/{Name}";10 11             Console.WriteLine(result);12         }13     }

然后就迫不及待的去看看底層怎么玩的,其實在下面的IL圖中可以看到,在底層最終還是調用了String.Format方法來實現的。

二:using靜態類

  這種寫法看起來有點不倫不類的,乍一看也沒有什么用處,不過可以告訴我們一個原理,就是不管你上層怎么變,編譯器還是一樣使用

全命名,這就叫萬變不離其宗吧。

三:空值判斷

  先還是來看看這種玩法的真容。

1     class Bird2     {3         public void Fly(string name)4         {5             var result = name?.Length;6         }7     }

是不是看著有點眼暈?那就對了,編譯器就是這樣靜靜的端著碗看著我們寫這些裝逼的代碼,不過再怎么裝逼,也逃不過ILdasm的眼睛。

其實仔細看IL代碼之后,覺得一切還是那么的熟悉,重點就是這個brtrue.s。它的狀態也決定了兩條執行流,不過在IL上面也看到了V_1這個編譯

器給我們單獨定義的一個變量,代碼還原如下:

 1     class Bird 2     { 3         public void Fly(string name) 4         { 5             int? r; 6  7             if (name == null) 8             { 9                 int? V_1 = new Nullable<int>();10 11                 r = V_1;12             }13             else14             {15                 r = new Nullable<int>(name.Length);16             }17         }18     }

四:nameof表達式

  當我知道這個關鍵字的用途時,我的第一反應就是公司框架里面的LogManager類,當我們new LogManager的時候,會同時把當前的類名

傳遞下去,然后做些后期處理,但是在以前我們只能這么做,要么用反射,要么寫死。

 1 namespace Consoleapplication3 2 { 3     class Program 4     { 5         static void Main(string[] args) 6         { 7             //第一種:使用反射 8             var ilog = new LoggerManager(typeof(Program)); 9 10             //第二種:寫死11             ilog = new LoggerManager("Program");12 13             Console.WriteLine("world");14         }15     }16 17     class LoggerManager18     {19         /// <summary>20         /// 構造函數記錄下類名21         /// </summary>22         /// <param name="type"></param>23         public LoggerManager(Type type)24         {25             //todo26             Console.WriteLine(type.Name);27         }28         public LoggerManager(string className)29         {30             //todo31             Console.WriteLine(className);32         }33     }34 }

我想大家也能看到,第一種使用了反射,這是需要讀取元數據的,性能你懂的,第二個雖然是字符串,你也看到了,是寫死的方式,這個時候就

急需一個加強版,就像下面這樣。

看到IL后,反正我是雞動了。。。nameof具有上面兩者的優點,既靈活,性能又高。。。。不錯不錯,贊一下。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马尔康县| 望城县| 铜梁县| 饶平县| 封丘县| 天等县| 资中县| 平阳县| 海晏县| 五大连池市| 雷州市| 金塔县| 军事| 眉山市| 普安县| 南京市| 遂川县| 咸丰县| 三亚市| 五峰| 岗巴县| 竹溪县| 嘉兴市| 大足县| 临潭县| 宜昌市| 东乡| 长乐市| 德庆县| 五大连池市| 光山县| 湘乡市| 长兴县| 建平县| 新巴尔虎左旗| 富蕴县| 株洲县| 双牌县| 瓦房店市| 梁山县| 高雄县|