6

式ツリーに関するいくつかの記事といくつかのstackoverflow.comの投稿を読みました。理解するのに頭がいっぱいです。

質問:

1) DOM (Document Object Model) と同様に、ロジックのメモリ内表現ですか?

2) 実行可能コードをデータに変換するメカニズムであり、それを使用してコードを表すデータ構造を生成できると誰かが説明しました。

ユーザー定義パターンを設計するために式ツリーが使用されるということですか?

3) 例のほとんどは、デリゲートまたは他のデリゲートと組み合わせて式ツリーを示しFunc<>ています。そのため、デリゲートや他のプログラミング構造を使用しても、式ツリーが提供するのと同じことを達成することはできません。

初心者にも分かりやすい説明は大歓迎です。

4

5 に答える 5

16

式ツリーは、単一の式の構文ツリーを表します。

ツリーの各ノードは、何らかの定数、オブジェクト メンバー参照、または操作を表します。

たとえば、2 + 3 構築できる式と式ツリーの場合:

Expression.MakeBinary(
    ExpressionType.Add,
    Expression.Constant(2),
    Expression.Constant(3));

このようなツリーの中で最も重要なのは Expression です。これにより、TDelegate に一致する署名のラムダ関数を思い起こさせる読みやすい形式で式を記述できます。元はこちら

Expression<Func<int>> sum = () => 2 + 3; // much nicer, eh?

ただし、式は直接実行できないため、デリゲートではありません。

代わりに、たとえばビジター オブジェクトを使用してトラバースし、実行可能な表現を構築することができます。例としては、Expression.Compile() を使用したデリゲート ビルドや、CompiledQuery.Compile() などを使用して LINQ クエリから構築された SQL クエリがあります。

式ツリーのもう 1 つの便利なアプリケーションは、リフレクションの使用を必要とするオブジェクトのメンバーを表すためにそれらを使用することです。リフレクションは文字列を使用してメンバー名を表し、コンパイル時にチェックを行いません。式ツリーがチェックされるため、エラーが少し少なくなる可能性があります。

PropertyInfo prop1 = typeof(MyClass).GetProperty("Value");

Expression<Func<MyClass, int>> expr = mc => mc.Value;
PropertyInfo prop2 = (mc.Body as MemberExpression).Member as PropertyInfo;
于 2009-10-19T14:36:21.757 に答える
10

Expressionは、コード操作をオブジェクト モデルとして表現する汎用性の高い方法です。これは 4.0 でさらに拡張されていますが、これは私がよく使用する領域ですここにいくつかのブログ ポイントがあります。または、 InfoQですべてを説明する別の試みがあります。この件については、何度か紹介しました。ここからダウンロードしてみてください(ただし、言葉がないと意味がありません。申し訳ありません)。

正直に言います。単純なテーマではありませんが、理解すると非常に強力です。上記のことから、私はおそらく InfoQ から始めるでしょう。

于 2009-10-19T15:07:26.933 に答える
3

基本を解説した記事はこちら…

要するに:

1) 基本的に、はい、ロジックのメモリ内表現です。

2) MSIL にコンパイルできます (または、LINQ-to-SQL の場合と同様に、他の言語にもコンパイルできます)。

3) Func<> デリゲートは、式を呼び出し可能な関数 (MSIL として内部的にコンパイルされる) として表すために使用されるため、使用されます。

于 2009-10-19T14:30:02.737 に答える
2

次のブログ投稿のC#FAQブログで、あなたのような質問に答えようとしました:VisualStudio2010での式ツリーを使用した動的メソッドの生成。だから、はい、それはメモリ内にあります。「ユーザー定義パターン」の意味はわかりませんが、動的コードの記述には使用できます。いいえ、実行時にデリゲートを変更できないため、ETをデリゲートに置き換えることはできません。唯一の代用はMSILであり、これは読み取りと書き込みがはるかに困難です。

于 2009-10-28T19:04:45.463 に答える
1

私はこのテーマの専門家ではありませんが、道を切り開くように努めます。

式ツリーは、型付けされたリフレクションと考えてください。オペランド、パラメーターなど、関数が何を持っているかを知る簡単な方法です。

だから、
1) 私はそうだと思います。
2) 正確ではありません... まず機能を学んでから (私も)、それが何に役立つかを見つけてください。コードを生成していますか?私にとっては、式ツリーの非常に便利な機能になる可能性があります。
3) 式ツリー これは新しい機能ですが、以前はできなかったことは何もありません。今はもっと簡単です。

ここに基本を説明 する良い記事があります。

于 2009-10-19T14:34:48.700 に答える