C#2.0のanonymous methodsとlambdaの違いは何ですか式 of C#3.0。?
2.0より前のバージョンのC#では、デリゲートを宣言する唯一の方法は、名前付きメソッドを使用することでした。 C#2.0は匿名メソッドを導入し、C#3.0以降では、ラムダ式がインラインメソッドに代わってインラインコードを記述するための好ましい方法となっています。ただし、このトピックの匿名メソッドに関する情報は、ラムダ式にも適用されます。無名メソッドがラムダ式にはない機能を提供するケースが1つあります。匿名メソッドを使用すると、パラメーターリストを省略できます。つまり、匿名メソッドをさまざまな署名を持つデリゲートに変換できます。これはラムダ式では不可能です。ラムダ式の詳細については、「ラムダ式(C#プログラミングガイド)」を参照してください。
ラムダ式は無名関数であり、式とステートメントを含めることができ、デリゲートまたは式ツリータイプの作成に使用できます。すべてのラムダ式は、ラムダ演算子=>を使用します。これは、「移動先」として読み取られます。ラムダ演算子の左側は入力パラメーター(ある場合)を指定し、右側は式またはステートメントブロックを保持します。ラムダ式x => x * xは、「xはxのx倍になります」と読み取られます。この式は、次のようにデリゲート型に割り当てることができます。
最後の点は、ラムダを超える匿名メソッドの唯一の利点だと私は信じています。ただし、no-opサブスクリプションを使用してフィールドのようなイベントを作成すると便利です。
public event EventHandler Click = delegate{};
多かれ少なかれ微妙な違いの範囲については、Eric Lippert(C#言語デザイナー)のブログで説明しています。
まず、利便性:ラムダは読み書きが簡単です。
次に、式:ラムダをどちらかデリゲート、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;
ステートメント本文を含むラムダ式はデリゲートにのみコンパイルでき、Expression
sにはコンパイルできないことに注意してください。
Action a = () => { Console.WriteLine(obj.ToString()); };