Func
ラムダとデリゲートは理解できますAction
。しかし、式は私を困惑させます。
Expression<Func<T>>
どのような状況で、単純な ではなくを使用しますかFunc<T>
?
ベストアンサー1
ラムダ式を式ツリーとして扱い、実行するのではなく内部を確認する場合。たとえば、LINQ to SQL は式を取得し、それを同等の SQL ステートメントに変換してサーバーに送信します (ラムダを実行するのではなく)。
概念的には、は とはまったく異なりますExpression<Func<T>>
。は、メソッドへのポインターにほぼ等しい を表し、 はラムダ式のツリー データ構造を表します。 このツリー構造は、実際の処理ではなく、ラムダ式が何を行うかを表します。 基本的に、式、変数、メソッド呼び出しなどの構成に関するデータを保持します (たとえば、このラムダは定数 + パラメーターであるなどの情報を保持します)。 この説明を使用して、実際のメソッドに変換したり ( を使用)、他の処理 (LINQ to SQL の例など) を実行したりできます。 ラムダを匿名メソッドおよび式ツリーとして扱う操作は、純粋にコンパイル時の処理です。Func<T>
Func<T>
delegate
Expression<Func<T>>
Expression.Compile
Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }
実質的には、何も取得せず 10 を返す IL メソッドにコンパイルされます。
Expression<Func<int>> myExpression = () => 10;
パラメータを受け取らず、値 10 を返す式を記述するデータ構造に変換されます。
コンパイル時にはどちらも同じに見えますが、コンパイラが生成するものはまったく異なります。