我正在使用一个TableLayoutPanel
动态填充 other 的TablelayoutPanels
.
现在我想知道当我调用TableLayoutPanel.Controls.Clear
动态填充时会发生什么TableLayoutPanel
。显然,所有的子布局都被删除了,但是他们的孩子呢?它们是否也被妥善处理,还是我需要担心内存泄漏?
我应该在调用之前递归删除孩子的孩子Clear()
吗?
我正在使用一个TableLayoutPanel
动态填充 other 的TablelayoutPanels
.
现在我想知道当我调用TableLayoutPanel.Controls.Clear
动态填充时会发生什么TableLayoutPanel
。显然,所有的子布局都被删除了,但是他们的孩子呢?它们是否也被妥善处理,还是我需要担心内存泄漏?
我应该在调用之前递归删除孩子的孩子Clear()
吗?
Clear不会释放控件,从而导致内存泄漏。从链接:
调用 Clear 方法不会从内存中删除控制句柄。您必须显式调用 Dispose 方法以避免内存泄漏。
由于在循环中处理会弄乱索引,因此您可以将控件集合复制到另一个列表并对其执行ForEach
循环或使用向后For
循环。
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
调用Dispose
将从内存中删除控件(当 GC 拾取它时)。这也将处理子控件Dispose
方法的调用。
一个问题是,如果您有一个实现的自定义控件,IDisposable
或者您在Dispose
不调用该方法的情况下覆盖该base
方法。在您的对象的Dispose
方法中,您需要确保您已取消订阅您范围之外的任何事件。如果您不这样做,该引用将使您的对象保持活动状态。
你的问题有点混乱。Clear()
将删除引用和对象将被垃圾收集器收集。
但是,你也在使用这个词dispose
。清除的对象不会被释放,因为它们的Dispose
方法将被调用。
因此,如果您不再使用这些对象,并且想Dispose
被调用它们,则必须自己做。