看看C# 6.0中那些語法糖都干了些什麼(中篇)。本站提示廣大學習愛好者:(看看C# 6.0中那些語法糖都干了些什麼(中篇))文章只能為提供參考,不一定能成為您想要的結果。以下是看看C# 6.0中那些語法糖都干了些什麼(中篇)正文
參考頁面:
http://www.yuanjiaocheng.net/CSharp/csharp-generic-sortlist.html
http://www.yuanjiaocheng.net/CSharp/csharp-generic-dictionary.html
http://www.yuanjiaocheng.net/CSharp/csharp-partial-class.html
http://www.yuanjiaocheng.net/CSharp/csharp-Static.html
http://www.yuanjiaocheng.net/CSharp/csharp-Anonymous-method.html
接著上篇持續扯,其實語法糖也不是什麼好事,第一個就是吃不吃隨你,第二個就是最好要知道這些糖在底層都做了些什麼,不過有一點
叫眼見為實,這樣才干安心的運用,一口吻上五樓,不費力。
一:字符串嵌入值
我想String.Format辦法就是化成灰大家都看法,比方上面代碼:
1 class Bird 2 { 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 Bird 2 { 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 else 14 { 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 LoggerManager 18 { 19 /// <summary> 20 /// 結構函數記載下類名 21 /// </summary> 22 /// <param name="type"></param> 23 public LoggerManager(Type type) 24 { 25 //todo 26 Console.WriteLine(type.Name); 27 } 28 public LoggerManager(string className) 29 { 30 //todo 31 Console.WriteLine(className); 32 } 33 } 34 }
我想大家也能看到,第一種運用了反射,這是需求讀取元數據的,功能你懂的,第二個雖然是字符串,你也看到了,是寫死的方式,這個時分就
急需一個增強版,好像上面這樣。
看到IL後,反正我是雞動了。。。nameof具有下面兩者的優點,既靈敏,功能又高。。。。不錯不錯,贊一下。