Form.Dispose()方法会调用其内部控件的Dispose()方法吗?

10

当我创建一个表单时,自动生成的代码中没有包含重写的Dispose方法。这是否意味着表单中的所有控件都没有被调用Dispose方法?

2个回答

16
当你在窗体上调用Dispose方法时,它将为其Controls集合中的每个控件调用Dispose方法。这些控件也会依次执行相同的操作,因此最终应该已经调用了所有控件的Dispose方法。请注意,这不是基于控件是否存在于设计者中,而是基于在调用Dispose方法时在窗体的Controls集合中找到的控件实例。
唯一可能不会发生这种情况的情况是,如果您自己创建了一些容器控件,并覆盖Dispose方法而没有将调用传播到基类或遍历包含的控件并在其中调用Dispose

是的。组件的处理方式不同,这就是自动生成的Dispose()方法所负责的。从Controls集合中移除控件而不进行处理是造成泄漏的好方法。 - Hans Passant

4
应该可以。您可能需要查看YourForm.designer.cs文件。它应该是这样的:
protected override void Dispose(bool disposing)
{
   if(disposing && (components != null))
   {
      components.Dispose();
   }
   base.Dispose(disposing)
}
base.Dispose();调用将负责清理添加到窗体中的控件。

这并不完全正确;除非您在表单上有非 UI 组件(例如 TimerHelpProviderBackgroundWorker),否则 components 字段为 nullcomponents 处理这些组件的释放。它不会调用其他控件(如按钮、文本框等)的 dispose 方法。 - Fredrik Mörk
确切地说,表单的控件实际上是通过调用base.Dispose()来处理的,即在Control.Dispose()内部。实际上还有更多的清理工作,当您使用Reflector查看Form.Dispose()时会发现。 - Dirk Vollmar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接