Когда вызывать метод Dispose() в приложении WPF
У меня есть простое приложение с одним окном WPF, содержащее текстовые поля и кнопки. И я также использую NotifyIcon и DateTimePicker из Windows Forms в окне WPF. Как я могу эффективно избавиться от всех элементов управления?
4 ответов
вряд ли что-нибудь в WPF имеет Dispose
метод. Подавляющее большинство классов инкапсулируют чисто управляемую информацию. Вы можете прикрепить объект в дерево (например, через Children.Add
метод), и вы можете удалить его снова - так работает управление состоянием. Это точно не вписывается в IDisposable
pattern, потому что после удаления элемента управления вы можете добавить его снова, тогда как Dispose
означает навсегда (хотя вы можете использовать Dispose
управлять им в дополнение к Add
/Remove
методы.)
обсуждение об этом на форумах Microsoft.
есть несколько вещей, которые должны быть IDisposable
а не DispatcherTimer
, и нет ничего, чтобы остановить вас от реализации IDisposable
на ваших собственных классах. Это до вас, когда позвонить Dispose
; в основном, когда вы знаете, что больше не будете использовать объект.
на Window
вы просто называете Close
, чтобы закрыть его, и WPF заботится обо всем еще.
Я бы сказал, что в приложениях WPF применяется то же правило, что и в любых других приложениях .NET: если объект реализует IDisposable
, вам необходимо позвонить Dispose
когда вы закончите его использования. Если вы динамически загружаете и выгружаете элементы управления, и они не реализуют IDisposable
, просто установка любых ссылок на null
(и отсоединение любых обработчиков событий) должно быть достаточно для сборщика мусора, чтобы выполнить свою работу.
Если этот элемент управления является частью некоторого IContainer (это общая модель в .NET), чем ваши элементы управления просто нуждается в реализации IDisposable. Таким образом, Dispose() будет вызываться автоматически, когда наступит подходящее время.
соблюдать 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);
}
}