Форма диалога WinForms - закрыть или удалить? - PullRequest
15 голосов
/ 10 ноября 2011

Я унаследовал некоторый код и хотел запустить эту модификацию всеми вами, моя задача - управление памятью.

Допустим, у меня есть «базовая» форма с кучей кнопок, которые открывают «диалоговые» формы.Какой шаблон рекомендуется использовать для открытия диалоговых форм?В настоящее время мы отображаем форму «диалога» следующим образом (в «базовом» коде формы после нажатия кнопки):

ChangePasswordForm frm = new ChangePasswordForm();
frm.ShowDialog();

Затем закрываем ее так (в коде формы «диалога»):

private void bCancel_Click(object sender, EventArgs e)
{
  this.Close();
  //this.Dispose();  <-- this is what I am considering adding.
}

Мое обоснование добавления Dispose заключается в том, что я беспокоюсь, если эта форма многократно отображается и закрывается, что каждый раз, когда создается новый экземпляр формы и его ресурсы никогда не освобождаются.-- это правильно?Кроме того, если форма имеет «закрывающий» X в правом верхнем углу, должен ли я также поместить вызов Dispose () в событие FormClosed?

Заранее спасибо.

Ответы [ 2 ]

26 голосов
/ 10 ноября 2011

Я бы использовал оператор using:

  using (var frm = new ChangePasswordForm()) {
      frm.ShowDialog();
  }

Объедините это с DialogResult:

private void bCancel_Click(object sender, EventArgs e)
{
   this.DialogResult = DialogResult.Cancel;
}

Установка DialogResult, закроет Dialog, и абонент / владелецимеет некоторую обратную связь.

И вам не нужно беспокоиться о закрытии или удалении.

18 голосов
/ 10 ноября 2011

Согласно MSDN, вам нужно распоряжаться при двух условиях:

Два условия, когда форма не размещается при закрытии, это когда (1) она является частью интерфейса с несколькими документами (MDI).) приложение, а форма не видна;и (2) вы отобразили форму, используя ShowDialog.В этих случаях вам нужно будет вызвать Dispose вручную, чтобы пометить все элементы управления формы для сбора мусора.

MSDN Form.Close

Объявление формыв операторе using будет подходящим способом справиться с этим.

        using (ChangePasswordForm frm = new ChangePasswordForm())
        {
            frm.ShowDialog();
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...