很多时候有一个明确的方法,即从集合中删除所有项目,这些项目也会被处理掉。
喜欢,
toolStripMenuItem.DropDownItems.Clear();
就足够了,或者我应该这样打电话:
foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
toolStripMenuItem.DropDownItems.Remove(item);
item.Dispose();
}
编辑:好吧ToolStripItem是一个不是问题的例子,对于那些说Clear已经足够的人我找到了另一个例子,TabControl也有项目集合和清除方法。但TabControls可以有复杂的控件(至少我有),需要显式Dispose(即使它们在某些时候由GC自动处理,导致它们占用大量内存)。我想最好的答案是处理项目的divo评论,然后打电话给。
答案 0 :(得分:8)
问:吗?
答:否 - Clear
不处理这些项目(它们可以在您的应用程序的其他部分使用)。
那么,如果你的ToolStripItem是标准的.NET,那么Clear
是否足够?经过一番反思,我会说“可能不是”。
是的,如果您在应用程序的其他部分有任何对ToolStripItem的引用,那么.NET GarbageCollector 将会销毁(使用类析构函数 )它自动。但是,不会调用 Dispose(true)
方法,也就是说,表单的IDisposable
组件需要它。
实际上,我相信你需要明确地Dispose
你的项目,就像ToolStrip的 Dispose 方法一样(用替换 this > yourToolStrip ):
if (!this.Items.IsReadOnly)
{
for (int i = this.Items.Count - 1; i >= 0; i--)
{
this.Items[i].Dispose();
}
this.Items.Clear();
}
我还创建了the following thread来更一般地澄清这个问题。
答案 1 :(得分:2)
当您处理非托管内存,共享资源或大内存区域时,您应该依赖Dispose()
调用。似乎不是这种情况。
答案 2 :(得分:2)
调用Clear
不会处置这些项目,但会将集合中的引用移除到项目中。如果这是对项目的唯一引用,那么它们将在某个时刻自动进行垃圾收集(您无法预测,但您可以使用GC
类进行控制)。
答案 3 :(得分:0)
我不这么认为,更多,它可能会导致许多逻辑问题,因为您可能在集合中引用该对象供以后使用。如果您没有对该对象的引用,垃圾收集器将在以后处置该对象