class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = delegate()
{
Console.Writeline("Hiya!!");
};
myDelegate();
}
}
盡管匿名方法對基於方法的委托調用更進了一步,但是Lambda表達式允許你用更加簡潔,功能性的格式寫匿名方法。
你可以將Lambda表達式作為一個參數列表來編寫代碼,跟在=>後面,再跟上一個表達式或者語句。以上的代碼可以用如下的代碼替換:
class Program
{
delegate void DemoDelegate();
static void Main(string[] args)
{
DemoDelegate myDelegate = () => Console.WriteLine("Hiya!!") ;
myDelegate();
}
}
盡管Lambda表達式顯得更加簡潔,實際上他們也是一個匿名方法的功能性超集。特別的,Lambda表達式提供了如下的額外的功能:
·它們允許參數類型是被推斷的。匿名方法要求你必須清楚的陳述每個類型的狀態。
·它們可以支持查詢表達式或C#語句。
·它們可以被看作使用表達式樹的數據。這是不能用匿名方法來做的。
查詢表達式
這個特性使得你可以在C#中使用SQL類似風格的語句,也被稱作LINQ(語言集成查詢)。
舉例來說,你可以這樣描述你的數據:
ublic class CoOrdinate
{
public int x ;
public int y;
}
在C#裡,你可以像下面一樣輕松的聲明一個數據庫表的邏輯等同式:
// Use Object and collection initializers
List<CoOrdinate> coords = ... ;
現在你的數據可以作為一個collection來實現 IEnumerable<T>,你可以輕松的像如下方式查詢數據:
var filteredCoords =
from c in coords
where x == 1
select (c.x, c.y)
在以上SQL風格的格式中,"from"、"where"和"select"是查詢表達式,用到了C# 3.0的一些特性如匿名類型,擴展方法,隱式類型本地變量等。這樣,你可以使用SQL風格的格式,將無聯系的數據整合一起來工作。
每個查詢表達式實際上轉變為一個C#的調用,如:
where x == 1
將會轉換為:
coords.where(c => c.x == 1)
你可以看到,這個看上去很像一個可怕的Lambda表達式和擴展方法。C# 3.0還有其他很多關於它們的查詢表達式和規則。
表達式樹
C# 3.0包含了一個新類型,允許表達式能夠當作運行時的數據使用。這個類型,System.Expressions.Expression<T>,只是一個內存中一個lambda表達式的重新表達。結果是你的代碼可以在運行時修改和檢查Lambda表達式。
如下是一個表達式樹的例子:
Expression<DemoDelegate> filter = () => Console.WriteLine("Hiya!!") ;
使用如上的表達式樹的方法,你可以使用過濾器變量中的各種屬性來檢查樹的內容。
結束語
C# 3.0提供了一些新的特性,使得你可以更輕松的完成一個程序員和架構設計師的工作,同時也保持了程序語言的嚴謹和清晰的結構。
C# 3.0目前還處於襁褓中,還將在未來的數月中長大,但是它所能改變的一切,緊靠其強大的後盾.Net框架,它的體系結構和設計模式,值得你的關注。A