Ни один не "лучше", чем другой; они совершенно эквивалентны!
Однако в данном конкретном случае оба неверны . Метод ShowDialog
требует, чтобы вы вызвали метод Dispose
в форме. В отличие от комбинации Show
и Close
, это не выполняется автоматически. Из MSDN:
Когда форма отображается в виде модального диалогового окна, нажатие кнопки «Закрыть» (кнопка с крестиком в правом верхнем углу формы) приводит к тому, что форма скрывается, а свойство DialogResult устанавливается на * 1014. *. В отличие от немодальных форм, метод Close
не вызывается .NET Framework, когда пользователь нажимает кнопку закрытия формы диалогового окна или задает значение свойства DialogResult
. Вместо этого форма скрыта и может быть показана снова без создания нового экземпляра диалогового окна. Поскольку форма, отображаемая в виде диалогового окна, скрыта, а не закрыта, необходимо вызвать метод Dispose
формы, когда форма больше не нужна вашему приложению.
Таким образом, вам следует выбрать одну из следующих (эквивалентных) форм:
using (Form1 frm = new Form1())
{
frm.ShowDialog();
}
или
Form1 frm = new Form1();
frm.ShowDialog();
frm.Dispose();
Причина, по которой ShowDialog
не удаляет автоматически форму, достаточно проста, если не сразу очевидна. Оказывается, что приложениям часто требуется считывать значения из экземпляра модальной диалоговой формы после того, как форма была закрыта, например настройки, указанные в элементах управления формы. Если форма будет автоматически удалена, вы не сможете прочитать эти значения, открыв свойства объекта формы. Таким образом, программист отвечает за удаление форм, отображаемых в виде модальных диалоговых окон, когда с ними заканчиваются.