2011-12-24 4 views

ответ

40

Ни один из них не «лучше», чем другой; они совершенно эквивалентны!

Однако в данном конкретном случае оба ошибочны. ShowDialog method требует, чтобы вы начислили метод Dispose на форме. В отличие от комбинации Show и Close, это делается не автоматически. Из MSDN:

Когда форма отображается в виде модального диалогового окна, нажав кнопку Закрыть (кнопка с X в правом верхнем углу формы) вызывает форму быть скрыты и свойство DialogResult должен быть установлен в DialogResult.Cancel. В отличие от немодальных форм метод Close не вызывается .NET Framework, когда пользователь нажимает кнопку закрытия формы диалогового окна или устанавливает значение свойства DialogResult. Вместо этого форма скрыта и может быть показана снова без создания нового экземпляра диалогового окна. Поскольку форма, отображаемая в виде диалогового окна, скрыта, а не закрыта, вы должны вызвать метод формы Dispose формы, когда форма больше не нужна вашему приложению.

Таким образом, вы должны выбрать один из них (эквивалентных) формах:

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

или

Form1 frm = new Form1(); 
frm.ShowDialog(); 
frm.Dispose(); 

Причина, по которой ShowDialog автоматически не выбрасывайте форму достаточно просто, если не сразу видно. Оказывается, что приложения часто хотят считывать значения из экземпляра модальной формы диалога после, форма закрыта, например, параметры, указанные в элементах формы. Если форма была автоматически удалена, вы не сможете прочитать эти значения, обратившись к свойствам объекта формы. Таким образом, программист отвечает за удаление форм, показанных в виде модальных диалогов, когда он закончил с ними.

+0

Отличное разъяснение относительно того, почему MODAL сохраняет форму в памяти, чтобы извлечь другие элементы после ее закрытия, а не автоматически отпущена. – DRapp

+0

Чтобы уточнить: если экземпляр формы хранится в локальной переменной, он будет иметь право на сбор мусора, когда он выходит за пределы области видимости, и будет * в конечном итоге удален (см. Это SO [ответ] (http://stackoverflow.com/а/11690188/945456)). Все еще хорошая идея сделать это явно, конечно. –

+0

За исключением остальных, самое первое предложение ** неправильно **. Так как вы должны/должны называть 'frm.Dispose(), а второй - хуже первого. _Что стыдно за хороший ответ после этого! – Bitterblue

2

Вообще-то я пошел бы в первый 1, потому что вы можете получить доступ к форме впоследствии.

В противном случае 2-й вариант в порядке, если вы не хотите иметь дело с ним после его закрытия.

+0

память dispose() at (new form1()). ShowDialog(); ? –

+0

вы спрашиваете, находится ли память после завершения showdialog. Если это так, то он сохраняет память для любого объекта в C#, как только ничего не ссылается на него. Поэтому, когда диалог закрыт, все ссылки исчезнут, и GC выполнит свою работу. –

Смежные вопросы