5

私は現在、MSDNのウォークスルー:IQueryable LInQプロバイダーの作成を読んでおり、の使用法がたくさんありますExpressionVisitor

不思議に思うのですが、これを使うのは費用のかかる操作ですか?

リフレクションと同じくらい高価ですか?

4

1 に答える 1

1

いいえ、式ツリーをExpressionVisitor.

式ツリーの解析に必要なランタイム コストはまったくありません。コンパイラは、コンパイル時にExpression をオブジェクト ツリーに変換するすべての作業を行います。問題のオブジェクトがメモリ内に作成されるとき、実行時のリフレクションはあまり行われません。次のようなメソッド呼び出しが表示された場合:

SomeMethod(Foo x => x.Property);

SomeMethod の引数がExpression型指定されると、コンパイラはコードを IL に変換します。IL は、次のように記述したように動作します。

SomeMethod(new MemberExpression {
  Expression = new ParameterExpression("x", typeof(Foo)),
  Member = typeof(Foo).GetProperty("Property")
});

詳細については、生成された IL を確認するか、Microsoft のドキュメントで実際の例を参照してください。いくつかのリフレクションが含まれます (たとえば、参照MemberExpressionsを保持するPropertyInfo) が、すべて非常に高速です。

懸念しているアプリがある場合は、そのアプリをプロファイリングして (たとえば、Visual Studio の最近のバージョンにはパフォーマンス プロファイラーが組み込まれています)、どの部分が遅いかを確認してください。

于 2013-02-02T13:32:54.430 に答える