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

StackOverflow https://stackoverflow.com/questions/208381

  •  03-07-2019
  •  | 
  •  

質問

    

この質問にはすでに回答があります:

         

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

役に立ちましたか?

解決

匿名メソッドのMSDNページで説明

  

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. ラムダ式はデリゲートまたは式ツリーに変換できます(いくつかの制限があります)。匿名メソッドはデリゲートにのみ変換できます
  2. ラムダ式はパラメーターの型推論を許可します:
  3. ラムダ式を使用すると、本体を式(値を返す)または単一のステートメント(その他の場合)にブレースなしで切り捨てることができます。
  4. ラムダ式を使用すると、型を推測でき、パラメーターが1つしかない場合に、パラメーターリストをパラメーター名のみに短縮できます
  5. 匿名メソッドを使用すると、パラメーターリストを本体内で使用せず、あいまいさを引き起こさない場合にパラメーターリストを完全に省略することができます

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

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

多かれ少なかれ微妙な違いの範囲については、エリック・リッパート(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()); };
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top