Какой лучший способ показать модальный диалог?Каков лучший способ вызвать Form.ShowDialog()?
form1 frm=new form1();
frm.showDialog()
или
(new form1()).showDialog();
Какой лучший способ показать модальный диалог?Каков лучший способ вызвать Form.ShowDialog()?
form1 frm=new form1();
frm.showDialog()
или
(new form1()).showDialog();
Ни один из них не «лучше», чем другой; они совершенно эквивалентны!
Однако в данном конкретном случае оба ошибочны. 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
автоматически не выбрасывайте форму достаточно просто, если не сразу видно. Оказывается, что приложения часто хотят считывать значения из экземпляра модальной формы диалога после, форма закрыта, например, параметры, указанные в элементах формы. Если форма была автоматически удалена, вы не сможете прочитать эти значения, обратившись к свойствам объекта формы. Таким образом, программист отвечает за удаление форм, показанных в виде модальных диалогов, когда он закончил с ними.
Вообще-то я пошел бы в первый 1, потому что вы можете получить доступ к форме впоследствии.
В противном случае 2-й вариант в порядке, если вы не хотите иметь дело с ним после его закрытия.
память dispose() at (new form1()). ShowDialog(); ? –
вы спрашиваете, находится ли память после завершения showdialog. Если это так, то он сохраняет память для любого объекта в C#, как только ничего не ссылается на него. Поэтому, когда диалог закрыт, все ссылки исчезнут, и GC выполнит свою работу. –
Отличное разъяснение относительно того, почему MODAL сохраняет форму в памяти, чтобы извлечь другие элементы после ее закрытия, а не автоматически отпущена. – DRapp
Чтобы уточнить: если экземпляр формы хранится в локальной переменной, он будет иметь право на сбор мусора, когда он выходит за пределы области видимости, и будет * в конечном итоге удален (см. Это SO [ответ] (http://stackoverflow.com/а/11690188/945456)). Все еще хорошая идея сделать это явно, конечно. –
За исключением остальных, самое первое предложение ** неправильно **. Так как вы должны/должны называть 'frm.Dispose(), а второй - хуже первого. _Что стыдно за хороший ответ после этого! – Bitterblue