我有一个简单的 WPF 单窗口应用程序,其中包含文本框和按钮。而且我还在WPF窗口中使用了Windows Forms的NotifyIcon和DateTimePicker。如何有效地处置所有控件?
4 回答
WPF 中几乎没有任何东西有Dispose
方法。绝大多数类封装了纯托管信息。您可以将一个对象附加到树中(例如,通过一个Children.Add
方法),然后您可以再次删除它——这就是状态管理的工作方式。它完全不适合该IDisposable
模式,因为一旦您删除了一个控件,您就可以再次添加它,而Dispose
意味着永远(尽管您可以使用/方法Dispose
来管理它)。Add
Remove
有一些东西应该是IDisposable
但不是,比如DispatcherTimer
,并且没有什么可以阻止你IDisposable
在自己的类上实现。何时打电话由您决定Dispose
;基本上,当您知道您将不再使用该对象时。
对于Window
您只需调用Close
关闭它,WPF 会处理其他所有事情。
我想说,WPF 应用程序中的规则与任何其他 .NET 应用程序中的规则相同:如果一个对象实现了IDisposable
,则应该Dispose
在使用完毕后调用它。如果您动态加载和卸载控件,并且它们没有实现IDisposable
,那么只需设置对null
(并分离任何事件处理程序)的任何引用就足以让垃圾收集器完成其工作。
遵守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);
}
}
如果该控件是某些 IContainer(这是 .NET 中的通用模型)的一部分,那么您的控件只需要实现 IDisposable。因此 Dispose() 将在适当的时候自动调用。