我什么时候应该手动处置控件?我如何知道控件是否实现了 IDisposable?

问题描述 投票:0回答:4

在之前关于删除系统托盘中旧的 NotifyIcon 的问题中,我被告知应该处置任何实现 IDisposable 的东西。对我来说听起来是个好习惯,但作为新手,它提出了更多问题:-)

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

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

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

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

  

如果没有,那么我如何知道需要手动处理哪些控件,或者我应该在测试期间观察异常行为?

那么,当我单击子窗体上的大红色“X”时,不会导致它处置吗?对吗?这是什么原因呢?

.net controls dispose
4个回答
2
投票

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

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

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


2
投票

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

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


0
投票

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

if(object is IDisposable) {
    ((IDisposable)object).Dispose();
}

0
投票

如果您点击 X 来关闭 modal 表单,该表单实际上是隐藏的。需要手动调用dispose来释放资源。
请参阅此处:http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult.aspx

© www.soinside.com 2019 - 2024. All rights reserved.