这都是关于 Expression
类型的 Compile
方法。对不起,我来晚了,太天真了。我一直在阅读有关构建表达式以启用可执行代码的动态修改的内容。当涉及到从给定表达式树发出 lambda 表达式时,只要针对不同的输入/环境(比如任何给定常量/参数/成员表达式的不同值),这对我来说是有意义的。我想,如果我可以缓存(重新使用)那些从表达式树生成/编译的 lambda,那将是理想的,前提是环境没有变化。
问题:即使环境没有变化,CLR 是否总是发出 lambda 表达式?如果是这样,最好的办法是在环境没有变化的情况下避免从 lambda 编译表达式?
最佳答案
CLR 不缓存 lambda 表达式,Compile()
每次都返回一个新的委托(delegate)。
但它应该很容易缓存,通过这样的方式:
public Func<T> Get<T>(Expression<Func<T>> expression)
{
string key = expression.Body.ToString();
Func<T> result;
if (!_cache.TryGetValue(key, out result)) {
result = expression.Compile();
_cache.Add(key, result);
}
return result;
}
关于c# - 表达式树和编译方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17150945/