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

9

我有一个简单的WPF单窗口应用程序,其中包含文本框和按钮。我还在WPF窗口中使用了Windows Forms的NotifyIcon和DateTimePicker控件。如何有效地处理所有控件?

4个回答

7
几乎所有WPF中都没有Dispose方法。绝大多数类都封装了纯管理信息。您可以将一个对象附加到树中(例如通过Children.Add方法),然后可以将其删除 - 这就是状态管理的工作原理。它完全不符合IDisposable模式,因为一旦您删除了一个控件,就可以再次添加它,而Dispose意味着永远删除(尽管您可以使用DisposeAdd/Remove方法一起管理)。 在Microsoft论坛上讨论它。 有一些东西应该是IDisposable但不是,例如DispatcherTimer,并且没有阻止您在自己的类上实现IDisposable。什么时候调用Dispose取决于您; 基本上是当您知道不再使用对象时。
对于Window,只需调用Close即可关闭它,WPF会处理其他所有事情。

2

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


1

遵循CA1001:让拥有类型实现IDisposable

放弃旧的Windows Forms真理,即所有控件都是IDisposable的。自己实现并调用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);
    }
}

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接