匿名メソッド(C#2.0)とラムダ式(C#3.0)の違いは何ですか? [複製]
-
03-07-2019 - |
質問
この質問にはすでに回答があります:
- デリゲートキーワードとラムダ表記 6つの答え
C#2.0の 匿名メソッド とC#3.0の ラムダ式 の違いは何ですか?
解決
2.0より前のC#のバージョンでは、唯一の デリゲートを宣言する方法は、使用することでした 名前付きメソッド。 C#2.0が導入されました 匿名メソッドおよびC#3.0および 後で、ラムダ式が優先されます 好ましい方法としての匿名メソッド インラインコードを記述します。しかし 匿名メソッドに関する情報 このトピックはラムダにも適用されます 式。 1つのケースがあります 匿名メソッドが提供するもの ラムダにない機能 式。匿名メソッドが有効になります パラメータリストを省略します。 これは、匿名メソッド でデリゲートに変換できます さまざまな署名。これではありません ラムダ式で可能です。にとって より詳細な情報 ラムダ式、ラムダを参照 式(C#プログラミングガイド)。
ラムダ式は、式とステートメントを含むことができる匿名関数であり、デリゲートまたは式ツリー型を作成するために使用できます。 すべてのラムダ式は、ラムダ演算子= <!> gt;を使用します。これは、<!> quot; goes to <!> quot;として読み取られます。ラムダ演算子の左側は入力パラメーター(存在する場合)を指定し、右側は式またはステートメントブロックを保持します。ラムダ式x = <!> gt; x * xは<!> quot; xはx回x。<!> quot;になります。この式は、次のようにデリゲートタイプに割り当てることができます。
他のヒント
- ラムダ式はデリゲートまたは式ツリーに変換できます(いくつかの制限があります)。匿名メソッドはデリゲートにのみ変換できます
- ラムダ式はパラメーターの型推論を許可します:
- ラムダ式を使用すると、本体を式(値を返す)または単一のステートメント(その他の場合)にブレースなしで切り捨てることができます。
- ラムダ式を使用すると、型を推測でき、パラメーターが1つしかない場合に、パラメーターリストをパラメーター名のみに短縮できます
- 匿名メソッドを使用すると、パラメーターリストを本体内で使用せず、あいまいさを引き起こさない場合にパラメーターリストを完全に省略することができます
最後の点は、ラムダに対する匿名メソッドの唯一の利点です。ただし、no-opサブスクリプションを使用してフィールドのようなイベントを作成すると便利です。
public event EventHandler Click = delegate{};
- 匿名メソッドは基本的に名前のない関数であり、クロージャーを作成できます。
- ラムダ式は、匿名メソッドと式ツリーの両方に変換可能な構造であり、匿名メソッドよりも複雑な型推論の規則に従います。
多かれ少なかれ微妙な違いの範囲については、エリック・リッパート(C#言語デザイナー)がブログで説明しています。
まず、利便性:ラムダは読み書きが簡単です。
第二に、式:ラムダは、デリゲート、または式ツリー(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()); };