天天看點

細數C# 4.0四大新特性

 在十年前的釋出會上,最難忘的莫過于C#新程式設計語言的釋出,當然也有新的Visual Basic(VB),關于垃圾回收,Java和.NET,C#和VB.NET,C++和VB6的性能對比等高潮看點。作為微軟.NET架構的标志性語言,C#在微軟的開發戰略中演了一個非常關鍵的角色。随着該語言呈現出動态和功能程式設計語言的特性,其角色也在不斷向前發展。 

     一轉眼,現在已經用到C# 4了。C# 4與COM互操作性、對後期綁定模型的支援也更友好,而當C#之父Anders Hejlsberg讨論動态類型如何能夠簡化COM接口處理和其它複雜的互動時,有一些程式員擔憂C#會向新的方向分化。Hejlsberg表示他知道經常修改語言功能所帶來的危險。不過他表示,“你不能對語言的底層經常進行修改。對于C#來說,它的核心設計是一個指令式的面向對象程式設計語言。你可以對其增加從功能程式設計語言和動态程式設計語言所借鑒來的功能,但是其核心設計并非發生改變。”文本主要是對C#以及C#4.0新特征進行詳細的介紹。 

在之前的文章中,我們曾介紹過C#的曆史及C# 4.0新增特性,包括:dynamic、命名和可選參數、動态導入以及協變和逆變等。今天我們結合代碼執行個體來具體看一下C# 4.0中的四個比較重要的特性。

  <b>1.dynamic ExpandoObject</b>

  熟悉js的朋友都知道js可以這麼寫 :

#div_code img{border:0px;}var t = new Object();  t.Abc = ‘something’;  t.Value = 243; 

  現在這個js動态語言的特性,我們也可以在c#中使用了,前提是将一個變量聲明為ExpandoObject類型。如下例:

#div_code img{border:0px;}static void Main(string[] args) { dynamic t = new ExpandoObject(); t.Abc = "abc"; t.Value = 10000; Console.WriteLine("t's abc = {0},t's value = {1}", t.Abc, t.Value); Console.ReadLine(); }

  C# 4.0中新增了一個命名空間System.Dynamic來實作對此應用的支援,這種用法的意義何在,現在我還不太清楚,也是是C#向動态語言過渡的一種試探吧。關于動态語言請參考《5月程式設計語言排行榜:動态語言的前世今生》。

  <b>2.泛型自動轉換</b>

  在C# 4.0之前下面的代碼是不可以編譯通過的

#div_code img{border:0px;}IEnumerable&lt;object&gt; objs = new List&lt;string&gt; {          "I'm 0","I'am 1","I'am 2"     };  

  是在C# 4.0中這種聲明是允許的,不過也僅限于泛型接口,泛型類型的類似做法是不允許的,如下代碼是有編譯錯誤的

#div_code img{border:0px;}List&lt;object&gt; objList = new List&lt;string&gt; {           "I'am 0","I'am 1","I'am 2"     };  

 <b>3.方法參數之可選參數</b>   如下方法聲明的文法

#div_code img{border:0px;}static void DoSomething(int notOptionalArg,string arg1 = "default Arg1", string arg2 = "default arg2") { Console.WriteLine("arg1 = {0},arg2 = {1}",arg1,arg2); } 

這個方法有三個參數第一個是必選參數,第二個和第三個是可選參數,他們都有一個預設值。這種形式對固定參數的幾個方法重載很有用。如下調用:

#div_code img{border:0px;}static void Main(string[] args) { DoSomething(1); DoSomething(1, "葫蘆"); DoSomething(1, "葫蘆", "黃瓜"); Console.ReadLine(); } 

也許你會想到,假如我有一個和可選參數方法不選某個參數相同的方法簽名的方法時,C#會怎麼處理呢,我們看下下面的代碼

#div_code img{border:0px;}static void DoSomething(int notOpArg, string arg) { Console.WriteLine("arg1 = {0}", arg); } 這裡又重載了一個DoSomething

這個方法有兩個參數,但是沒有可選參數,實驗證明調用DoSomething(1,”arg”)時會優先執行沒有可選參數的方法。

  <b>4.方法參數之命名參數</b>

#div_code img{border:0px;}static void DoSomething(int height, int width, string openerName, string scroll) { Console.WriteLine("height = {0},width = {1},openerName = {2}, scroll = {3}",height,width,openerName,scroll); } 

命名參數讓我們可以在調用方法時指定參數名字來給參數指派,這種情況下可以忽略參數的順序。如下方法聲明:

  我們可以這樣來調用上面聲明的方法

#div_code img{border:0px;}static void Main(string[] args) { DoSomething( scroll : "no",height : 10, width : 5, openerName : "windowname"); Console.ReadLine(); } 

很顯然的這是一個文法糖,但是在方法參數很多的情況下很有意義,可以增加代碼的可讀性。

     本文轉自My_King1 51CTO部落格,原文連結:http://blog.51cto.com/apprentice/1360685,如需轉載請自行聯系原作者

繼續閱讀