当我将表达式编译成可执行代码并获取委托时 - 如果不存在对该委托的更多引用,代码是否会被垃圾收集?
有关于此的文件吗?因为我在MSDN中找不到任何有用的东西。
答案 0 :(得分:11)
是的,代码可以被垃圾收集。当您在Expression of T上调用Compile时,代码将被编译为DynamicMethod,并且这些代码可以进行垃圾回收。
实际上它没有在MSDN上显示,但你可以看一下DLR中Expression< T> .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。