web-dev-qa-db-ja.com

無名メソッド(C#2.0)とラムダ式(C#3.0)の違いは何ですか?

C#2.0のanonymous methodslambdaの違いは何ですか式 of C#3.0。?

43
Codeslayer

匿名メソッドのMSDNページで説明しています

2.0より前のバージョンのC#では、デリゲートを宣言する唯一の方法は、名前付きメソッドを使用することでした。 C#2.0は匿名メソッドを導入し、C#3.0以降では、ラムダ式がインラインメソッドに代わってインラインコードを記述するための好ましい方法となっています。ただし、このトピックの匿名メソッドに関する情報は、ラムダ式にも適用されます。無名メソッドがラムダ式にはない機能を提供するケースが1つあります。匿名メソッドを使用すると、パラメーターリストを省略できます。つまり、匿名メソッドをさまざまな署名を持つデリゲートに変換できます。これはラムダ式では不可能です。ラムダ式の詳細については、「ラムダ式(C#プログラミングガイド)」を参照してください。

そしてラムダ式に関して

ラムダ式は無名関数であり、式とステートメントを含めることができ、デリゲートまたは式ツリータイプの作成に使用できます。すべてのラムダ式は、ラムダ演算子=>を使用します。これは、「移動先」として読み取られます。ラムダ演算子の左側は入力パラメーター(ある場合)を指定し、右側は式またはステートメントブロックを保持します。ラムダ式x => x * xは、「xはxのx倍になります」と読み取られます。この式は、次のようにデリゲート型に割り当てることができます。

29
Brian R. Bondy
  1. ラムダ式はデリゲートまたは式ツリーに変換できます(いくつかの制限があります)。無名メソッドはデリゲートにのみ変換できます
  2. ラムダ式では、パラメーターの型推論が可能です。
  3. ラムダ式を使用すると、本文を中括弧なしの式(値を返す)または単一のステートメント(その他の場合)に切り捨てることができます。
  4. ラムダ式を使用すると、型を推測できる場合、およびパラメーターが1つしかない場合に、パラメーターリストをパラメーター名だけに短縮できます。
  5. 匿名メソッドを使用すると、本文内で使用されておらず、あいまいさを招かない場合に、パラメーターリストを完全に省略できます。

最後の点は、ラムダを超える匿名メソッドの唯一の利点だと私は信じています。ただし、no-opサブスクリプションを使用してフィールドのようなイベントを作成すると便利です。

public event EventHandler Click = delegate{};
29
Jon Skeet
  1. 無名メソッドは基本的に名前のない関数であり、クロージャーを作成する機能があります。
  2. ラムダ式は、匿名メソッドと式ツリーの両方に変換可能な構造であり、匿名メソッドよりも型推論のより複雑な規則に従います。

多かれ少なかれ微妙な違いの範囲については、Eric Lippert(C#言語デザイナー)のブログで説明しています。

23
Pop Catalin

まず、利便性:ラムダは読み書きが簡単です。

次に、式:ラムダをどちらかデリゲート、or式ツリー(Expression<T>などの一部のデリゲート型Tの場合はFunc<int,bool>)にコンパイルできます。式ツリーは、インプロセスのデータストアへのLINQの鍵となるため、よりエキサイティングです。

Func<int,bool> isEven = i => i % 2 == 0;
Expression<Func<int,bool>> isEven = i => i % 2 == 0;

ステートメント本文を含むラムダ式はデリゲートにのみコンパイルでき、Expressionsにはコンパイルできないことに注意してください。

Action a = () => { Console.WriteLine(obj.ToString()); };
13
Marc Gravell