表达式.编译和垃圾收集
当我将表达式编译为可执行代码并获取委托时,当不再存在对此委托的引用时,代码是否会被垃圾收集?
有这方面的文档吗?因为我在MSDN上没有找到任何有用的东西。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
是的,代码可以被垃圾收集。当您对 T 的表达式调用 Compile 时,代码将编译为 DynamicMethod,并且那些有资格进行垃圾回收。
事实上,MSDN 上没有指出,但您可以查看 DLR 中的 Expression.Compile 的实现,这就是 .net 4.0 所提供的:
http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638
尽管编译器的实现在 . net 3.5 中,仍然使用 DynamicMethods(来源:我自己,我在 Mono 中实现了 System.Linq.Expressions)。
编译的表达式树不可收集的情况是当您使用 ExpressionCompileToMethod 时 ,并且您从不是使用 RunAndCollect 标志。
Yes, the code can be garbage collected. When you call Compile on an Expression of T, the code is compiled into a DynamicMethod, and those are eligible for garbage collection.
Indeed it's not indicated on the MSDN, but you can have a look at the implementation of Expression<T>.Compile in the DLR, which is what .net 4.0 ships:
http://dlr.codeplex.com/SourceControl/changeset/view/54115#990638
Although the implementation of the compiler was different in .net 3.5, DynamicMethods were still used (source: myself, I implemented System.Linq.Expressions in Mono).
The case where compiled expression trees are not collectible, is when you use Expression<T>CompileToMethod, and that you pass a MethodBuilder from an AssemblyBuilder which was not created with the RunAndCollect flag.