Форма диалога WinForms - закрыть или удалить?

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

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

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?

Спасибо заранее.

Ответы

Ответ 1

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

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

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

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

Настройка DialogResult закроет диалоговое окно, и у вызывающего/владельца будет некоторая обратная связь.

И вам не нужно беспокоиться о Close или Dispose.

Ответ 2

В соответствии с MSDN вам нужно утилизировать в двух условиях:

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

MSDN Form.Close

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

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