表达式.编译和垃圾收集

发布于 2024-10-24 12:42:29 字数 92 浏览 4 评论 0 原文

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

有这方面的文档吗?因为我在MSDN上没有找到任何有用的东西。

When I compile an expression into executable code and get the delegate - does the code get garbage collected when no more references to this delegate exist?

Is there any documentation on this? Because I didn't find anything useful in the MSDN.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

愛放△進行李 2024-10-31 12:42:29

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文