【发布时间】:2010-12-30 10:53:50
【问题描述】:
很多时候有一个明确的方法,从集合中删除所有项目,这些项目是否也被丢弃。
喜欢,
toolStripMenuItem.DropDownItems.Clear();
足够了,或者我应该这样打电话:
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
编辑:嗯 ToolStripItem 是一个例子而不是一个问题,对于那些说 Clear 就足够了我找到了另一个例子,TabControl 也有项目集合和 clear 方法。但是 TabControls 可以有复杂的控件(至少我有),这些控件需要显式 Dispose(即使它们在某个时候被 GC 自动 Dispose,因为它们占用了大量内存)。我想最好的答案是 divo 评论来处理项目,然后调用 clear。
【问题讨论】:
-
我相信作者是一个 C/C++ 开发人员,他“需要”在每个函数中处理资源,即使在 .NET 中不是这种必要性。我怀疑从集合中清除项目后完成/处置项目的必要性。
-
@serhio - 在 .NET 中,在
IDisposable资源上调用Dispose()仍然是你的工作,或者确保Dispose()被其他代码调用。 -
使用 .NET Reflector 是查看
ToolStripItemCollection.Clear()是否在集合项上实际调用Dispose的好方法。如果您查看反汇编的源代码,您会发现它没有。 -
@Marc:告诉我一个原因,我为什么要处理 ToolStripItem?我只是把这个任务留给了 GC。
-
@serhio:
ToolStripItem是否实际使用非托管资源是一个实现细节。事实上,它实现了IDisposable,并且IDisposable的contract 说“这个对象可能直接或间接使用一些非托管资源,你应该在用完它时将其丢弃。 "
标签: c# .net collections dispose