调用Clear是否也处理了这些项目?

时间:2009-12-28 11:23:16

标签: c# .net collections dispose clear

很多时候有一个明确的方法,即从集合中删除所有项目,这些项目也会被处理掉。

喜欢,

toolStripMenuItem.DropDownItems.Clear();

就足够了,或者我应该这样打电话:

foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
  toolStripMenuItem.DropDownItems.Remove(item);
  item.Dispose();
}

编辑:好吧ToolStripItem是一个不是问题的例子,对于那些说Clear已经足够的人我找到了另一个例子,TabControl也有项目集合和清除方法。但TabControls可以有复杂的控件(至少我有),需要显式Dispose(即使它们在某些时候由GC自动处理,导致它们占用大量内存)。我想最好的答案是处理项目的divo评论,然后打电话给。

4 个答案:

答案 0 :(得分:8)

问:吗?

答: - Clear不处理这些项目(它们可以在您的应用程序的其他部分使用)。

那么,如果你的ToolStripItem是标准的.NET,那么Clear是否足够?经过一番反思,我会说“可能不是”。

是的,如果您在应用程序的其他部分有任何对ToolStripItem的引用,那么.NET GarbageCollector 将会销毁(使用类析构函数 )它自动。但是,不会调用 Dispose(true) 方法,也就是说,表单的IDisposable组件需要它。

阅读提案thisthis

实际上,我相信你需要明确地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)

我不这么认为,更多,它可能会导致许多逻辑问题,因为您可能在集合中引用该对象供以后使用。如果您没有对该对象的引用,垃圾收集器将在以后处置该对象