Controls.Clear()清理多深?

时间:2013-03-23 11:41:12

标签: c# winforms clear tablelayoutpanel

我正在使用动态填充其他TableLayoutPanel的{​​{1}}。

现在我想知道当我在动态填充的TablelayoutPanels上调用TableLayoutPanel.Controls.Clear时会发生什么。显然,所有的子布局都被删除了,但他们的孩子怎么样?它们是否也妥善处理或者我是否需要担心内存泄漏?

我应该在致电TableLayoutPanel之前递归删除孩子的孩子吗?

2 个答案:

答案 0 :(得分:16)

Clear不会丢弃控件,导致内存泄漏。从链接:

  

调用Clear方法不会从内存中删除控制句柄。   您必须显式调用Dispose方法以避免内存泄漏。

由于在循环中进行处理会使索引变得混乱,因此您可以将控件集合复制到另一个列表并对其执行ForEach循环或使用向后For循环。

 for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i) 
    myTableLayoutPanelControls[i].Dispose();

调用Dispose将从内存中删除控件(当GC选择它时)。这也将处理调用子控件的Dispose方法。

如果您有一个实现IDisposable的自定义控件,或者您在不调用Dispose方法的情况下覆盖了base方法,那么就会有一个问题。在对象的Dispose方法中,您需要确保取消订阅范围之外的任何事件。如果不这样做,该引用将使您的对象保持活力。

答案 1 :(得分:0)

你的问题有点混乱。 Clear()将删除引用,垃圾收集器将收集对象。

但是,您也在使用dispose这个词。清除的对象将处理,因为它们将调用Dispose方法。

因此,如果您不再使用这些对象,并且希望在其上调用Dispose,则必须自己执行。