在之前关于删除系统托盘中旧的 NotifyIcon 的问题中,我被告知应该处置任何实现 IDisposable 的东西。对我来说听起来是个好习惯,但作为新手,它提出了更多问题:-)
我如何知道控件是否实现了 IDisposable?
我应该构建一个类来尝试在 formclose 事件中处理所有表单上的所有内容吗?
类似这样的东西?(伪代码):
foreach(control cont in form)
{
try{cont.Dispose()}
catch{}
}
如果没有,那么我如何知道需要手动处理哪些控件,或者我应该在测试期间观察异常行为?
那么,当我单击子窗体上的大红色“X”时,不会导致它处置吗?对吗?这是什么原因呢?
表单所拥有的任何控件都会在表单被处置时被处置。换句话说,当调用 Dispose() 时,控件将对其所有子控件调用 Dispose()。请注意,隐藏表单不会调用 Dispose(),但在大多数情况下,只需创建一个对话框并根据需要处理它就可以了。
对于设计者生成的表单和控件来说总是如此。如果您在代码中创建像 NotifyIcon 这样的非可视组件(未设置所有者),则必须手动处置它。但正确设置所有者通常更容易。
任何实现 IDisposable 的类都应该对其子类调用 Dispose() ,无论是在集合中还是在属性中,除非有充分的理由不这样做(即在某些情况下,调用者可能仍然是对象的所有者 - 但这正是其中设置所有权的概念是为了)。
一种选择是在程序集上运行 FxCop。 它的规则之一将验证是否在所有实现 IDisposable 的对象上调用 Dispose,并在出现违规情况时向您发出警告。
编辑:为了回答您后面的问题,不会自动调用 Dispose。 你需要自己处理。 这是关于该主题的一篇文章。
您可以使用 is 运算符验证对象是否正在实现 IDisposable:
if(object is IDisposable) {
((IDisposable)object).Dispose();
}
如果您点击 X 来关闭 modal 表单,该表单实际上是隐藏的。需要手动调用dispose来释放资源。
请参阅此处:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx