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