2012-09-04 72 views
10

同時將自己深入到C#的更高級功能,我遇到了一些代碼,我並不完全知道它們之間的區別。這是關於這兩條線:Func <>與代表和lambda表達式之間的區別

Func<string, int> giveLength = (text => text.Length); 

Func<string, int> giveLength = delegate(string text) { return text.Length; }; 

這可以以同樣的方式被使用:

Console.WriteLine(giveLength("A random string.")); 

所以基本上..是什麼這兩條線的區別?這些行是否編譯爲相同的CIL?

回答

16

基本上它們是一樣的。它們都是C#規範術語中的匿名函數

Lambda表達式通常更加簡潔,也可以轉換爲expression trees,這對於進程外LINQ是至關重要的。

如果您不在意,匿名方法允許您刪除參數列表。例如:

EventHandler handler = delegate { 
    Console.WriteLine("Sender and args don't matter"); 
}; 

由於很少需要後一點,匿名方法正在成爲現代C#中的瀕危物種。 Lambda表達式更爲常見。

+0

謝謝喬恩。順便說一句,我最近開始閱讀你的電子書「深入C#」。很有幫助! –

+3

@memetolsen:缺點是,如果您在這裏閱讀了足夠的答案,您將閱讀本書的大部分內容;) –

+2

我認爲我的三分之一upvotes是你的答案。但是,我寧願在業餘時間閱讀這本書,而不是閱讀22,284個答案:) –

6

所以基本上..這兩條線有什麼區別?這些行是否編譯爲相同的CIL?

只有兩種不同的方式來寫同一件事。 lambda語法更新,更簡潔,但它們做同樣的事情(在這種情況下)。

請注意,lambdas(=>語法)也可以用於形成Expression Lambdas,其中您製作Expression Tree而不是委託。這很好,因爲無論您是使用LINQ to Objects(基於代表如Func<T, TResult>的代表)還是LINQ to Entities(使用IQueryable<T>和表達式樹),都可以使用相同的語法。

+0

感謝您的回答! –

相關問題