46

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

4

4 に答える 4

31

匿名メソッドに関するMSDNページで説明されています

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

そしてラムダ式に関して

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

于 2008-10-16T12:41:05.557 に答える
31
  1. ラムダ式は、デリゲートまたは式ツリーに変換できます (いくつかの制限があります)。匿名メソッドはデリゲートにのみ変換できます
  2. ラムダ式により、パラメーターの型推論が可能になります。
  3. ラムダ式を使用すると、本体を式 (値を返すため) または単一のステートメント (その他の場合) に丸括弧なしで切り詰めることができます。
  4. ラムダ式を使用すると、型を推測でき、パラメーターが 1 つしかない場合に、パラメーター リストをパラメーター名だけに短縮できます。
  5. 匿名メソッドでは、本体内で使用されていない場合、パラメーター リストを完全に省略でき、あいまいさが生じません。

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

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

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

于 2008-10-16T12:59:34.803 に答える
14

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

次に、式: ラムダは、デリゲートまたは式ツリー (などのデリゲート型 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()); };
于 2008-10-16T12:50:29.923 に答える