Expression<T>
がコンパイルされると、結果のコードはフレームワークによって暗黙的にキャッシュされますか? Regex
フレームワークが最後のいくつかの正規表現を暗黙的にコンパイルしてキャッシュする静的メソッドの方針に沿って考えています。
コンパイルされたExpression<T>
オブジェクトがキャッシュされていない場合、コンパイル時間を短縮するためのベスト プラクティスや、式を手動でキャッシュした場合に問題を引き起こす可能性のある問題を推奨できますか?
public MyResultType DoSomething(int arg1, int arg2)
{
var result = invokeHandler(
(IDoSomethingHandler h) => h.DoSomething(arg1, arg2)
);
return result;
}
private TResult invokeHandler<T, TResult>(Expression<Func<T, TResult>> action)
where T : class
{
// Here, I might want to check to see if action is already cached.
var compiledAction = action.Compile();
var methodCallExpr = action as MethodCallExpression;
// Here, I might want to store methodCallExpr in a cache somewhere.
var handler = ServiceLocator.Current.GetInstance<T>();
var result = compiledAction(handler);
return result;
}
この例では、コンパイルされた式をキャッシュすると、スタック内の適切な場所から値を取得するのではなく、式がコンパイルされた時点のarg1
andの値が使用されるのではないかと少し心配しています (つまり、arg2
現在の値を取得するのではなく)。