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

标签 c# winforms tablelayoutpanel

我正在使用一个 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/

相关文章:

c# - TableLayoutPanel 的控制列属性

c# - 将 GridView 标题文本设置为按指示换行

c# - ASP MVC 和 WinForm 应用程序之间的通信

c# - 使用 .Net win 窗体中的 cmd.exe 在命令行实用程序中运行多个命令

c# - 放置在 TableLayout 中的停靠控件的大小不会自动小于其创建大小

c# - TableLayoutPanel 不显示 C#

c# - 何时使用泛型和类型检查?

c# - 为什么 CenterToScreen 方法会在光标所在的屏幕而不是具有焦点的应用程序的屏幕上使表单居中?

c# - TableLayoutPanel 标签对齐到左上角?

c# - 当我们需要重入支持时,异步函数的互斥体替代方案