私は現在、MSDNのウォークスルー:IQueryable LInQプロバイダーの作成を読んでおり、の使用法がたくさんありますExpressionVisitor
。
不思議に思うのですが、これを使うのは費用のかかる操作ですか?
リフレクションと同じくらい高価ですか?
私は現在、MSDNのウォークスルー:IQueryable LInQプロバイダーの作成を読んでおり、の使用法がたくさんありますExpressionVisitor
。
不思議に思うのですが、これを使うのは費用のかかる操作ですか?
リフレクションと同じくらい高価ですか?
いいえ、式ツリーを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 の最近のバージョンにはパフォーマンス プロファイラーが組み込まれています)、どの部分が遅いかを確認してください。