【问题标题】:Do I need to dispose of dynamically-created controls before exiting a form?我是否需要在退出表单之前处理动态创建的控件?
【发布时间】:2014-06-22 19:53:46
【问题描述】:

我已经使用using 指令创建了我的选项表单的一个新实例,所以当我完成它时它会自动处理掉。我是否需要在关闭表单之前将其动态创建的控件处理掉,或者当我调用this.Close() 时它们会被自动处理掉?

【问题讨论】:

  • 只要他们有一个 Parent 集(他们应该有),dispose 是自动的。

标签: c# winforms memory-leaks dispose


【解决方案1】:

通常不会,所有控件都是动态创建的。通常在 InitializeComponent() 方法中,当代码出现在其他地方时,它并没有根本的不同。动态移除控件会让你陷入麻烦。

控件在其 Parent 被释放时自动释放。因此,只要您通过 Collection 属性将它们添加到它们的父级,那么您就不需要额外的代码来处理。触发器正在关闭使用 Show() 方法显示的表单的窗口,代码中的 using 语句用于使用 ShowDialog() 显示的表单。

您可以使用任务管理器检查是否正确。使用 View + Select Columns 添加USER Objects 列(右键单击 Windows 8 中的列表视图标题)。计数器非常可靠。重复创建和关闭表单不能不断增加显示值。

泄漏用户对象是 Winforms 中非常常见的错误,垃圾收集器不会让您摆脱麻烦。始终非常警惕代码中的任何 ControlCollection.Clear() 或 Remove/At() 语句。

【讨论】:

  • 您应该确保删除您可能已添加到动态添加的控件的所有事件处理程序。
  • 一般不会。同样的故事,InitializeComponent() 还添加了不必显式删除的事件处理程序。事件处理程序在 Form 对象和控件之间创建循环依赖关系,它们不会阻碍 GC。
  • 谢谢。我在任务管理器中添加了该列,当我打开选项表单时它会上升,当我关闭它时它会降低到其原始值。很好的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2011-09-16
  • 1970-01-01
相关资源
最近更新 更多