【发布时间】:2010-09-08 18:57:32
【问题描述】:
当我创建表单时,自动生成的代码不包含被覆盖的 Dispose 方法。这是否意味着没有为表单中的所有控件调用 Dispose?
【问题讨论】:
当我创建表单时,自动生成的代码不包含被覆盖的 Dispose 方法。这是否意味着没有为表单中的所有控件调用 Dispose?
【问题讨论】:
当您在表单上调用Dispose 时,它将为其Controls 集合中的每个控件调用Dispose。这些控件将依次执行相同的操作,因此最终应该调用所有控件的Dispose 方法。请注意,这不是基于控件是否存在于设计器中;它基于在完成对 Dispose 的调用时在表单的 Controls 集合中找到的控件实例。
我可以看到这不会发生的唯一情况是,如果您自己创建一些容器控件并覆盖 Dispose 而不将调用传播到基类或迭代包含的控件并在它们上调用 Dispose .
【讨论】:
应该的。您可能需要查看 YourForm.designer.cs 文件。它看起来像这样:
protected override void Dispose(bool disposing)
{
if(disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing)
}
base.Dispose(); 调用将负责清理添加到表单的控件。
【讨论】:
components 字段为 null,除非表单上有非 UI 组件(例如 Timer、HelpProvider 或 BackgroundWorker)。 components 处理处置这些组件。它不在按钮、文本框等其他控件上调用 dispose。
base.Dispose()的调用,即在Control.Dispose()内部进行的。当您使用 Reflector 查看 Form.Dispose() 时,实际上还有很多清理工作要做。