c# - Expression<TDelegate>.Compile 和垃圾收集

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

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

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

最佳答案

是的,代码可以被垃圾回收。当您对 T 的表达式调用编译时,代码将编译为 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)。

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

关于c# - Expression<TDelegate>.Compile 和垃圾收集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5340201/

相关文章:

C#设置xml文件位置

.net - 无法安装 .NET Standard 2.0

java - java中的字符串文字和垃圾收集器

c# - .NET 垃圾分析 : calculate how much garbage a piece of code is making

c# - 在另一个项目/命名空间中使用现有源代码

c# - 使用空白数组反序列化 JSON 对象

c# - 尝试用Bogus生成大规模测试数据集

c# - WinForms 中的 WPF : blocked on Dispatcher. 尽管 UI 线程处于事件状态但仍调用

c# - 使用 DllImport 从 C# 调用 Win API 的访问冲突

objective-c - GC 应用程序可以链接到 ARC 框架吗?