Expressionを使用する理由 > ではなく Func ? 質問する

Expressionを使用する理由 > ではなく Func ? 質問する

Funcラムダとデリゲートは理解できますAction。しかし、式は私を困惑させます。

Expression<Func<T>>どのような状況で、単純な ではなくを使用しますかFunc<T>?

ベストアンサー1

ラムダ式を式ツリーとして扱い、実行するのではなく内部を確認する場合。たとえば、LINQ to SQL は式を取得し、それを同等の SQL ステートメントに変換してサーバーに送信します (ラムダを実行するのではなく)。

概念的には、は とはまったく異なりますExpression<Func<T>>。は、メソッドへのポインターにほぼ等しい を表し、 はラムダ式のツリー データ構造を表します。 このツリー構造は、実際の処理ではなく、ラムダ式が何を行うかを表します。 基本的に、式、変数、メソッド呼び出しなどの構成に関するデータを保持します (たとえば、このラムダは定数 + パラメーターであるなどの情報を保持します)。 この説明を使用して、実際のメソッドに変換したり ( を使用)、他の処理 (LINQ to SQL の例など) を実行したりできます。 ラムダを匿名メソッドおよび式ツリーとして扱う操作は、純粋にコンパイル時の処理です。Func<T>Func<T>delegateExpression<Func<T>>Expression.Compile

Func<int> myFunc = () => 10; // similar to: int myAnonMethod() { return 10; }

実質的には、何も取得せず 10 を返す IL メソッドにコンパイルされます。

Expression<Func<int>> myExpression = () => 10;

パラメータを受け取らず、値 10 を返す式を記述するデータ構造に変換されます。

式と関数 拡大画像

コンパイル時にはどちらも同じに見えますが、コンパイラが生成するものはまったく異なります

おすすめ記事