表达式<tdelegate> .Compile和Garbage Collection </tdelegate>

时间:2011-03-17 14:11:54

标签: c# .net garbage-collection expression-trees

当我将表达式编译成可执行代码并获取委托时 - 如果不存在对该委托的更多引用,代码是否会被垃圾收集?

有关于此的文件吗?因为我在MSDN中找不到任何有用的东西。

1 个答案:

答案 0 :(得分:11)

是的,代码可以被垃圾收集。当您在Expression of T上调用Compile时,代码将被编译为DynamicMethod,并且这些代码可以进行垃圾回收。

实际上它没有在MSDN上显示,但你可以看一下DLR中Expression&lt; T&gt; .Compile的实现,这就是.net 4.0发布的:

http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638

虽然编译器的实现在.net 3.5中有所不同,但仍然使用DynamicMethods(来源:我自己,我在Mono中实现了System.Linq.Expressions)。

编译后的表达式树不可收集的情况是,当您使用Expression<T>CompileToMethod时,您从未使用RunAndCollect标志创建的AssemblyBuilder传递MethodBuilder。