1

在上一个关于删除旧 NotifyIcon 的系统托盘的问题中,有人告诉我我应该处理任何实现 IDisposable 的东西。对我来说听起来像是一个很好的做法,但是作为一个新手,它提出了更多的问题:-)

我如何知道控件是否实现了 IDisposable?

我应该建立一个类来尝试在 formclose 事件中处理我所有表单上的所有内容吗?

像这样的东西?(伪代码):

foreach(control cont in form)  
{  
try{cont.Dispose()}  
catch{}  
}

如果不是,那么我怎么知道我需要手动处理哪些控件,或者我应该在测试期间简单地观察异常行为?

G

编辑:所以当我点击我的孩子表单上的大红色“X”时,这不会导致它被丢弃吗?是对的吗?这是什么原因?

4

4 回答 4

2

表单拥有的任何控件都会在表单被处置时被处置。换句话说,当调用 Dispose() 时,控件将对它的所有子控件调用 Dispose()。请注意,隐藏表单不会调用 Dispose(),但在大多数情况下,只需创建一个对话框并根据需要处理它就可以了。

设计器生成的表单和控件总是如此。如果您在代码中创建像 NotifyIcon 这样的非可视组件(不设置所有者),则必须手动处置它。但是正确设置所有者通常更容易。

任何实现 IDisposable 的类都应该在其子级上调用 Dispose(),无论是在集合中还是在属性中,除非有充分的理由不这样做(即在某些情况下,调用者可能仍然是对象的所有者 - 但这正是在哪里设置所有权的概念是为了)。

于 2009-03-05T16:15:57.123 回答
2

一种选择是在您的程序集上运行 FxCop。其规则之一将验证是否正在对所有实现 IDisposable 的对象调用 Dispose,并在您有违规时警告您。

编辑:为了回答您以后的问题,不会自动调用 Dispose 。你需要自己处理。这是一篇关于这个主题的文章。

于 2009-03-05T16:31:31.220 回答
0

您可以使用 is 运算符验证对象正在实现 IDisposable:

if(object is IDisposable) {
    ((IDisposable)object).Dispose();
}
于 2009-03-05T16:21:21.620 回答
0

如果你点击 X 关闭一个模态表单,该表单实际上是隐藏的。您必须手动调用 dispose 来释放资源。
见这里:http: //msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx

于 2009-12-30T00:36:14.153 回答