何时在WPF应用程序中调用Dispose()方法

时间:2009-08-07 06:04:01

标签: c# wpf dispose

我有一个简单的WPF单窗口应用程序包含Textboxes和Buttons。我还在WPF窗口中使用Windows窗体的NotifyIcon和DateTimePicker。我怎样才能有效地处理所有控件?

4 个答案:

答案 0 :(得分:5)

WPF中的任何内容都没有Dispose方法。绝大多数类都封装了纯粹的托管信息。您可以将对象附加到树中(例如,通过Children.Add方法),然后您可以再次将其删除 - 这就是状态管理的工作方式。它完全不适合IDisposable模式,因为一旦删除了控件,就可以再次添加它,而Dispose意味着永远(尽管您可以使用Dispose来管理它除了Add / Remove方法之外。

A discussion about it on the Microsoft forums.

有些事情应该是IDisposable但不是DispatcherTimer,并且没有什么可以阻止你在自己的课程上实施IDisposable。您可以在何时致电Dispose;基本上当你知道你不再使用这个对象时。

对于Window,您只需致电Close即可将其关闭,而WPF会处理其他所有内容。

答案 1 :(得分:1)

我想说同样的规则适用于WPF应用程序,就像在任何其他.NET应用程序中一样:如果一个对象实现了IDisposable,那么在使用它时应该调用Dispose。如果您动态加载和卸载控件,并且它们没有实现IDisposable,那么设置对null的任何引用(以及分离任何事件处理程序)应该足以让垃圾收集器完成它的工作。

答案 2 :(得分:1)

坚持CA1001:让拥有类型实现IDisposable

放弃所有控件都为IDisposable的旧Windows窗体。实施并致电Dispose

sealed partial class MainWindow : IDisposable {
    readonly IDisposable disposable;
    public MainWindow() {
        disposable = ...
    }

    public void Dispose() {
        disposable.Dispose();
    }

    protected override void OnClosed(EventArgs e) {
        Dispose();
        base.OnClosed(e);
    }
}

答案 3 :(得分:0)

如果该控件是某些IContainer(这是.NET中的常见模型)的一部分,那么控件只需要实现IDisposable。因此,Dispose()将在适当的时间自动调用。