我正在使用一个 TableLayoutPanel
,它动态填充了其他 TablelayoutPanel
。
现在我想知道当我在动态填充的 TableLayoutPanel
上调用 TableLayoutPanel.Controls.Clear
时会发生什么。显然,所有的子布局都被移除了,但是他们的子布局呢?它们是否也得到妥善处理,还是我需要担心内存泄漏?
我应该在调用 Clear()
之前递归地删除 child 的 child 吗?
最佳答案
Clear不处理控件,导致内存泄漏。来自链接:
Calling the Clear method does not remove control handles from memory. You must explicitly call the Dispose method to avoid memory leaks.
由于在循环中处理会弄乱索引,您可以将控件集合复制到另一个列表并对它们执行 ForEach
循环,或者使用向后的 For
循环.
for (int i = myTableLayoutPanelControls.Count - 1; i >= 0; --i)
myTableLayoutPanelControls[i].Dispose();
调用 Dispose
将从内存中删除控件(当 GC 拾取它时)。这还将处理子控件的 Dispose
方法的调用。
一个问题是,如果您有一个实现了 IDisposable
的自定义控件,或者您在没有调用 base
的情况下重写了 Dispose
方法方法。在您对象的 Dispose
方法中,您需要确保您已取消订阅您范围之外的任何事件。如果不这样做,该引用将使您的对象保持事件状态。
关于c# - Controls.Clear() 清理多深?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15586347/