【问题标题】:When should I manually dispose of controls? How do I know if a control implements IDisposable?我什么时候应该手动处理控件?我如何知道控件是否实现了 IDisposable?
【发布时间】:2009-03-05 16:12:37
【问题描述】:

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

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

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

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

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

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

G

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

【问题讨论】:

    标签: .net controls dispose


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      编辑:为了回答您以后的问题,不会自动调用 Dispose。你需要自己处理。这是one article 的主题。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2013-09-09
            • 1970-01-01
            • 1970-01-01
            • 2011-10-10
            • 2011-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多