【发布时间】:2010-01-21 00:03:58
【问题描述】:
最近发现 ToGadget 中的变量,可能还有委托,没有被垃圾收集。任何人都可以看到为什么 .NET 持有对此的引用?似乎在 Foo 结束后,委托和所有人都将被标记为垃圾收集。从字面上看,在转储堆后,内存中有 B百万个。
注意:'result.Things' 是一个 List
public Blah Foo()
{
var result = new Blah();
result.Things = this.Things.ConvertAll((new Converter(ToGadget)));
return result;
}
.................
public static Gadget ToGadget(Widget w)
{
return new Gadget(w);
}
更新:将“ConvertAll”更改为此清除委托和相应的对象引用。这向我表明,要么 List ConvertAll 以某种方式保留了委托,要么我不明白这些东西是如何被垃圾收集的。
foreach (var t in this.Things)
{
result.Things.Add(ToGadget(t));
}
【问题讨论】:
-
该代码中的委托到底是什么?
-
Blindee:Converter的构造函数中的ToGadget。
-
那不是很清楚的代码。什么是转换器,什么是 Blah?
-
您的代码没有在 ToGadget 中引入任何变量,因此对 GC 没有任何影响...您能给我们一个真实的、可重现的示例(或一些真实的代码)吗?
-
如果这是一个旨在重现您遇到的问题的简化示例,您可以简化问题。
标签: c# .net memory-management delegates garbage-collection