【发布时间】:2016-02-05 11:24:46
【问题描述】:
假设我有一个带有属性栏的类型 Foo。
我得到了以下方法:
public static void DumpValue<T>(Expression<Func<T>> expr)
{
MemberExpression memberExpression = expression.Body as MemberExpression;
Debug.WriteLine("{0} => {1}", memberExpression.Member.Name, expr.Compile()());
}
它是这样使用的:
Foo a = new Foo{Bar ="Hello"};
Foo b = new Foo{Bar ="World"};
DumpValue(() => a.Test);
DumpValue(() => b.Test);
它给出了输出:
Bar => Hello
Bar => World
我的问题涉及连续的编译调用。返工 Func
如果是后者,我是否需要担心大量编译函数会污染内存,我的测试看不到任何影响。
我知道这可以通过重写 DumpValue 来避免,但我想知道幕后发生了什么。这里只是举例说明。
我在Source 中挖了一条路,但找不到任何线索。
改写这个问题: 编译器是否优化了实例并在此处缓存了一些信息,并且仅将实例烘焙到最终委托中,还是“一直”进行?
【问题讨论】:
-
每次调用
.Compile()都会编译新的DynamicMethod。 -
并且每个“编译”
Expression都连接到Foo的不同实例(a和b)
标签: c# lambda expression expression-trees