C#2.0の無名メソッドとC#3.0のラムダ式の違いは何ですか?
4 に答える
2.0より前のバージョンのC#では、デリゲートを宣言する唯一の方法は、名前付きメソッドを使用することでした。C#2.0では無名メソッドが導入されました。C#3.0以降では、インラインコードを記述するための推奨される方法として、ラムダ式が無名メソッドに取って代わります。ただし、このトピックの匿名メソッドに関する情報は、ラムダ式にも適用されます。匿名メソッドがラムダ式にはない機能を提供する場合が1つあります。匿名メソッドを使用すると、パラメーターリストを省略できます。これは、匿名メソッドをさまざまなシグニチャーを持つデリゲートに変換できることを意味します。これはラムダ式では不可能です。ラムダ式の詳細については、「ラムダ式(C#プログラミングガイド)」を参照してください。
ラムダ式は、式とステートメントを含めることができる無名関数であり、デリゲートまたは式ツリータイプを作成するために使用できます。すべてのラムダ式はラムダ演算子=>を使用します。これは、「goesto」として読み取られます。ラムダ演算子の左側は入力パラメーター(存在する場合)を指定し、右側は式またはステートメントブロックを保持します。ラムダ式x=>x * xは、「xはxのx倍になります」と読み取られます。この式は、次のようにデリゲートタイプに割り当てることができます。
- ラムダ式は、デリゲートまたは式ツリーに変換できます (いくつかの制限があります)。匿名メソッドはデリゲートにのみ変換できます
- ラムダ式により、パラメーターの型推論が可能になります。
- ラムダ式を使用すると、本体を式 (値を返すため) または単一のステートメント (その他の場合) に丸括弧なしで切り詰めることができます。
- ラムダ式を使用すると、型を推測でき、パラメーターが 1 つしかない場合に、パラメーター リストをパラメーター名だけに短縮できます。
- 匿名メソッドでは、本体内で使用されていない場合、パラメーター リストを完全に省略でき、あいまいさが生じません。
最後の点は、ラムダに対する匿名メソッドの唯一の利点だと思います。ただし、no-op サブスクリプションでフィールドのようなイベントを作成すると便利です。
public event EventHandler Click = delegate{};
- 匿名メソッドは、基本的に名前のない関数であり、クロージャーを作成する機能を備えています。
- ラムダ式は、匿名メソッドと式ツリーの両方に変換可能な構造であり、匿名メソッドよりも複雑な型推論の規則に従います。
多かれ少なかれ微妙な違いの範囲は、Eric Lippert (C# 言語デザイナー) によって彼のブログで説明されています。
まず、利便性です。ラムダは読み書きが簡単です。
次に、式: ラムダは、デリゲートまたは式ツリー (などのデリゲート型 T の場合) のいずれかにコンパイルできます。式ツリーは、アウトプロセス データ ストアへの LINQ の鍵であるため、より興味深いものです。Expression<T>
Func<int,bool>
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()); };