表达式<TDelegate> .Compile和Garbage Collection

Ale*_*tof 11 .net c# garbage-collection expression-trees

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

有没有这方面的文件?因为我在MSDN中找不到任何有用的东西.

Jb *_*ain 12

是的,代码可以被垃圾收集.当您在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.