看看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具有下面兩者的優點,既靈敏,功能又高。。。。不錯不錯,贊一下。