C# · 12月 23, 2021

c# – Controls.Clear()清理了多深?

我正在使用一个TableLayoutPanel动态填充其他TablelayoutPanels.

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

在调用Clear()之前,我应该递归删除孩子吗?

解决方法 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();

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

一个抓住是如果你有一个实现IDisposable的自定义控件,或者你在不调用基本方法的情况下覆盖Dispose方法.在对象的Dispose方法中,您需要确保您已经取消订阅范围之外的任何事件.如果你不这样做,那个参考将保持你的对象活着.