現在,使用對象初始化,就可以像這樣子來重寫:
Point p = new Point() { X = 0, Y = 0 };
這個特性也可以使用在集合上,看看下面這段示例:
List points = new List { new Point { X = 2, Y = 5 }, new Point { X = 1, Y = -10 }, new Point { X = 3, Y = 0 } };
注意,編譯器會產生和上面相等價的長一些的代碼,它依次調用Add()方法來在集合里添加元素。
IV/ 匿名類型
這個語言特性讓我們可以定義內嵌的類型,而不需要顯式地定義一個類型。換句話說,假設我們沒有定義Point類,卻要使用一個Point對象(即類型是匿名的)。我們可以使用上面提到的對象初始化語法,但不用指定類型名:
var p = new {X = 0, Y = 2};
在VS2008中,你仍然可以使用智能感應。所以如果你繼續使用變量p,就會得到這個匿名類型的屬性列表。
V/ Lambda表達式
在C#2.0 中引入了匿名方法,允許在需要委托的地方寫一個代碼塊。匿名方法提供了函數式程序語言的能力,語法顯得很簡潔。Lambda表達式提供了一個更簡潔的語法來寫匿名方法。一個Lambda表達式就是一個參數列表(可以隱式類型),然后是一個=>符號,然后是一個表達式或者一個語句塊。
作為一個示例,我們定義一個委托類型MyDeleg:
delegate R MyDeleg(A arg);
然后我們就可以使用匿名方法:
MyDeleg<int,bool> IsPositive = delegate(int num) { return num > 0; };
我們也可以使用新的Lambda表達式來寫:
MyDeleg<int,bool> IsPositive = num => num > 0;
VI/ 擴展方法
擴展方法可以使你來擴展一個已存在的類型,增加它的方法,而無需繼承它或者重新編譯。所以不像為對象寫助手方法,擴展方法可以直接是對象自己的一部分。
一個示例,假設我們想要驗證一個string是不是合法的Email地址,我們可以編寫一個方法,輸入為一個string并且返回true或者false,F在,使用擴展方法,我們可以如下這樣做:
public static class MyExtensions { public static bool IsValidEmailAddress(this string s) { Regex regex = new Regex( @"^[w-.]+@([w-]+.)+[w-]{2,4}$" ); return regex.IsMatch(s); } }
我們定義了一個帶有靜態方法的靜態類。注意,那個靜態方法在參數類型string前面有一個this關鍵詞,這會告訴編譯器這個特殊的擴展方法會增加給string類型的對象。于是我們就可以在string中調用這個成員方法:
using MyExtensions; string email = Request.QueryString["email"]; if ( email.IsValidEmailAddress() ) { // }
值得提出的是,LINQ就是使用了System.Linq命名空間中的擴展方法(比如where()、orderby()、select()、sum()、average()等等),而且它定義了標準查詢操作符,可以用來查詢關系數據庫、XML和任何實現了IEnumerable<T>接口的.NET對象。
VII/ 查詢語法
查詢表達式提供了一個語言集成的語法來查詢,它特別像關系和層次查詢語言比如SQL和XQuery。使用LINQ操作符(也就是from...where...select)寫查詢很方便,Visual Studio為它提供了很好的智能感知和編譯時的檢查支持。
當C#編譯器遇到了一個查詢語法表達式時,實際上它會被轉化為使用擴展方法和Lambda表達式的方法調用。
我們舉一個例子來解釋這個:
var result = from c in Customers where c.City.StartsWith("B") orderby c.LastName select new { c.FirstName, c.LastName, c.Address };
上面的代碼等價于:
var result = Customers.Where( c => c.City.StartsWith("B") ) .OrderBy( c => c.LastName ) .Select( c => new { c.FirstName, c.LastName, c.Address } );
使用查詢語法的好處還有它會使代碼更簡單更易讀。
同時注意,查詢表達式以from開頭,以select或者group結尾。
最后注意
C#3.0中新引入的幾個特性大多數都僅僅是“編譯器技巧”或者“語法糖”,其實編譯器生成的IL中間代碼和原來的是一樣的,這樣他們就獨立于framework和CLR運行時。但是,他們確實需要某些framework的支持,比如System.Core.dll程序集。這就是為什么擴展方法仍然需要依靠于System.Core.dll里包含的System.Runtime.CompilerServices.ExtensionAttribute。
另一方面,查詢表達式只是實現了到擴展方法的映射,它包含在System.Linq, System.Data.Linq和System.Xml.Linq命名空間中。
文章來源于領測軟件測試網 http://www.kjueaiud.com/