ラムダ式は匿名デリゲートのより単純な構文であり、匿名デリゲートを使用できるあらゆる場所で使用できます。ただし、その逆は当てはまりません。ラムダ式は、LINQ to SQLのような多くの魔法を可能にする式ツリーに変換できます。
以下は、匿名デリゲートを使用したLINQ to Objects式の例であり、次にラムダ式を使用して、それらがどれほど簡単に見えるかを示しています。
// anonymous delegate
var evens = Enumerable
.Range(1, 100)
.Where(delegate(int x) { return (x % 2) == 0; })
.ToList();
// lambda expression
var evens = Enumerable
.Range(1, 100)
.Where(x => (x % 2) == 0)
.ToList();
ラムダ式と匿名デリゲートには、個別の関数を作成するよりも利点があります。それらは、関数にパラメーターを追加したり、使い捨てオブジェクトを作成したりせずにローカル状態を関数に渡すことができるクロージャーを実装します。
式ツリーは、C#3.0の非常に強力な新機能で、APIは、実行可能なメソッドへの参照を取得するだけでなく、式の構造を調べることができます。APIはデリゲートパラメーターをパラメーターにする必要があるだけExpression<T>
で、コンパイラーは匿名デリゲートの代わりにラムダから式ツリーを生成します。
void Example(Predicate<int> aDelegate);
次のように呼ばれます:
Example(x => x > 5);
になる:
void Example(Expression<Predicate<int>> expressionTree);
後者には、式を説明する抽象構文ツリーの表現が渡されますx > 5
。LINQ to SQLは、この動作に依存して、C#式をサーバー側でのフィルタリング/順序付けなどに必要なSQL式に変換できます。
delegate