Когда вызывать метод 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);
    }
}