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

Pri*_*lia 22 .net c# collections dispose clear

很多时候,有一个明确的方法,从集合中删除所有项目,这些项目也被处置.

喜欢,

toolStripMenuItem.DropDownItems.Clear();
Run Code Online (Sandbox Code Playgroud)

是足够的,或者我应该这样打电话:

foreach (ToolStripItem item in toolStripMenuItem.DropDownItems)
{
  toolStripMenuItem.DropDownItems.Remove(item);
  item.Dispose();
}
Run Code Online (Sandbox Code Playgroud)

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

ser*_*hio 8

问:有吗?

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

那么,如果你的ToolStripItems是标准的.NET,那应该Clear足够了吗?经过一番反思,我会说"可能不是".

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

阅读这个这个的建议.

其实,我相信你会,但是,需要明确Dispose你的项目,如ToolStrip的的的Dispose方法不(替换这个yourToolStrip):

if (!this.Items.IsReadOnly)
{
    for (int i = this.Items.Count - 1; i >= 0; i--)
    {
        this.Items[i].Dispose();
    }
    this.Items.Clear();
}
Run Code Online (Sandbox Code Playgroud)

编辑

我还创建了以下线程来更一般地澄清这个问题.

  • 不,如果集合中的对象需要处理,则清除是不够的.终结者*可能*处置对象; 但是,如果发生这种情况并不确定,并且不确定它是否会发生(请参阅http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx:"The Finalize方法可能无法完成或在以下特殊情况下根本无法运行..." (3认同)