2010-09-08 76 views

回答

12

当您在窗体上呼叫Dispose时,它将为其Controls集合中的每个控件调用Dispose。这些控件反过来也会这样做,所以最终应该调用所有控件的方法Dispose。请注意,这不是基于控件是否存在于设计者中;它基于在完成对Dispose的调用时在表格的集合中找到的控件实例。

当我看到这种情况不会发生的唯一情况是,如果您自己创建一个容器控件并覆盖Dispose而不将该调用传播到基类或遍历包含的控件并在其上调用Dispose

+0

是的。组件的执行方式不同,这就是自动生成的Dispose()方法所要处理的内容。从Controls集合中删除控件并且不处理它是一种很好的泄漏方法。 – 2010-09-08 19:48:30

4

它应该。您可能需要查看YourForm.designer.cs文件。它看起来是这样的:

protected override void Dispose(bool disposing) 
{ 
    if(disposing && (components != null)) 
    { 
     components.Dispose(); 
    } 
    base.Dispose(disposing) 
} 

base.Dispose();通话将负责清理添加到表单控件。

+0

这不完全正确;除非表单上有非UI组件(例如'Timer','HelpProvider'或'BackgroundWorker'),否则'components'字段为'null'。 '组件'处理这些组件。它不*调用处理其他控件,如按钮,文本框等。 – 2010-09-08 19:13:24

+0

确切地说,表单的控件实际上是通过调用'base.Dispose()',即在'Control.Dispose()'内部处理的。实际上有更多的清理,正如您在使用Reflector查看“Form.Dispose()”时所看到的那样。 – 2010-09-08 19:20:12

+0

更新,感谢您的意见 – SwDevMan81 2010-09-08 19:26:46

相关问题