程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 看看C# 6.0中那些語法糖都干了些什麼(中篇)

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

編輯:C#入門知識

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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved