Когда вызывать метод Dispose () в приложении WPF - PullRequest
7 голосов
/ 07 августа 2009

У меня есть простое приложение с одним окном WPF, содержащее текстовые поля и кнопки. И я также использую NotifyIcon и DateTimePicker Windows Forms в окне WPF. Как я могу эффективно распоряжаться всеми элементами управления?

Ответы [ 4 ]

5 голосов
/ 07 августа 2009

Вряд ли в WPF есть метод Dispose. Подавляющее большинство классов инкапсулируют чисто управляемую информацию. Вы можете прикрепить объект к дереву (например, с помощью метода Children.Add) и снова удалить его - так работает управление состоянием. Он точно не вписывается в шаблон IDisposable, поскольку после удаления элемента управления его можно добавить снова, тогда как Dispose означает навсегда (хотя вы можете использовать Dispose для управления им в дополнение к Add / Remove методы).

Обсуждение этого на форумах Microsoft.

Есть несколько вещей, которые должны быть IDisposable, но не такие, как DispatcherTimer, и ничто не мешает вам реализовать IDisposable в ваших собственных классах. Вам решать когда звонить Dispose; в основном, когда вы знаете, что больше не будете использовать объект.

Для Window вы просто звоните Close, чтобы закрыть его, а WPF позаботится обо всем остальном.

1 голос
/ 23 февраля 2015

Придерживаться 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);
    }
}
1 голос
/ 07 августа 2009

Я бы сказал, что в приложениях WPF применяется то же правило, что и в любых других приложениях .NET: если объект реализует IDisposable, вам следует вызвать Dispose, когда вы закончите его использовать. Если вы динамически загружаете и выгружаете элементы управления, а они не реализуют IDisposable, достаточно просто установить любые ссылки на null (и отключить любые обработчики событий), чтобы сборщик мусора мог выполнить свою работу.

0 голосов
/ 07 августа 2009

Если этот элемент управления является частью некоторого IContainer (это общая модель в .NET), тогда ваши элементы управления просто нуждаются в реализации IDisposable. Таким образом, Dispose () будет вызываться автоматически, когда наступит подходящее время.

...