2012-09-04 8 views
10

C#のより高度な機能を深めながら、私はいくつかのコードに出くわしました。これは、次の2行についてです:Func <>とデリゲートとラムダ式の違い

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

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

これは、同じように使用することができます。

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

だから、基本的には。これらの2つのラインの違いは何ですか?これらの行は同じCILにコンパイルされていますか?

答えて

16

基本的には同じです。それらは両方とも匿名関数のC#仕様用語です。

ラムダ式は一般的により簡潔で、expression treesに変換することもできます。これはアウトプロセスLINQにとって重要です。

匿名メソッドを使用すると、気にしない場合でもパラメータリストを削除できます。例:

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

後者の点がほとんど必要ではないことを考えると、匿名メソッドは、現代のC#では危険な種になりつつあります。ラムダ式はもっと一般的です。

+0

ありがとうございました。 Btw私は最近、あなたの電子ブック「C#in Depth」の読書を始めました。非常に役立ちます! –

+3

@memetolsen:もしあなたが私の答えを十分に読んでいれば、本の内容のほとんどを読んでいるだろう; –

+2

私のアップアップの1/3はあなたの答えにあると思う。しかし、まだ、私はむしろ22,284の答えを読むのではなく、私の暇な時間に本を読むだろう:) –

6

これは基本的に..これらの2行の違いは何ですか?これらの行は同じCILにコンパイルされていますか?

同じことを書くには2通りの方法があります。ラムダの構文はより新しくより簡潔ですが、同じことをします(この場合)。

lambdas(=>構文)を使用してExpression Lambdasを作成することもできます。ここでは、代理人の代わりにExpression Treeを作成します。 LINQ to Objects(Func<T, TResult>のようなデリゲートをベースにしています)やLINQ to Entities(IQueryable<T>とエクスプレッションツリーを使用しています)を使用している場合でも、同じ構文を使用できます。

+0

あなたの答えをありがとう! –

関連する問題