Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用Form.ShowDialog()的更好方法是什么?_C#_.net_Winforms_Showdialog - Fatal编程技术网

C# 调用Form.ShowDialog()的更好方法是什么?

C# 调用Form.ShowDialog()的更好方法是什么?,c#,.net,winforms,showdialog,C#,.net,Winforms,Showdialog,哪种方式显示模式对话框更好 form1 frm=new form1(); frm.showDialog() 或 一般来说,我会选择第一个1,因为你可以在之后访问表单 否则,如果你不想在关闭后处理它,第二个就可以了。两个都不比另一个好;它们完全相等 但是,在这种特殊情况下,两者都是错误的。需要调用窗体上的Dispose方法。与显示和关闭组合不同,这不是自动完成的。从MSDN: 当窗体显示为模式对话框时,单击关闭按钮(窗体右上角带有X的按钮)将隐藏窗体,并将DialogResult属性设置为Dia

哪种方式显示模式对话框更好

form1 frm=new form1();
frm.showDialog()


一般来说,我会选择第一个1,因为你可以在之后访问表单

否则,如果你不想在关闭后处理它,第二个就可以了。

两个都不比另一个好;它们完全相等

但是,在这种特殊情况下,两者都是错误的。需要调用窗体上的
Dispose
方法。与
显示
关闭
组合不同,这不是自动完成的。从MSDN:

当窗体显示为模式对话框时,单击关闭按钮(窗体右上角带有X的按钮)将隐藏窗体,并将DialogResult属性设置为DialogResult。取消。与非模态窗体不同,.NET Framework在用户单击对话框的关闭窗体按钮或设置
DialogResult
属性的值时不会调用
Close
方法。相反,窗体是隐藏的,可以再次显示,而无需创建对话框的新实例。由于显示为对话框的表单是隐藏的,而不是关闭的,因此当应用程序不再需要该表单时,必须调用该表单的
Dispose
方法

因此,您应该在以下(等效)形式中选择一种:


ShowDialog
不自动处理表单的原因很简单,如果不是很明显的话。事实证明,应用程序通常希望在关闭窗体后从模式对话框窗体的实例中读取值,例如窗体控件中指定的设置。如果表单被自动释放,您将无法通过访问表单对象的属性来读取这些值。因此,程序员负责在完成模式对话框时处理显示为模式对话框的表单。

您是否询问是否在showdialog完成后处理内存。如果是这样,那么一旦不再有任何对象引用它,c#中任何对象的内存就会被释放。因此,一旦对话框关闭,所有引用都将消失,GC将完成它的工作。很好地解释了为什么MODAL将表单保留在内存中,以便在其关闭时提取其他元素,而不是自动释放。只是澄清一下:如果表单实例保存在局部变量中,那么当它超出范围时,它将有资格进行垃圾收集最终将被处置(见下文)。当然,明确地这样做仍然是一个好主意。除其他外,第一句话是错误的。因为您必须/应该调用
frm.Dispose()第二个比第一个差。考虑到后来的好答案,真是太遗憾了!如果你考虑异常,这两个“表单”就不等价了。太可惜了,在不保留任何资源的情况下,MS不鼓励一次性对象支持方法和属性,这些方法和属性可以指示它们的状态是什么时候被配置的。IMHO如果在表单关闭时立即释放与表单控件相关的资源,但能够询问其成员当时持有的是什么,比让表单根据显示资源的方式来决定是否释放资源更干净。
(new form1()).showDialog();
using (Form1 frm = new Form1())
{
    frm.ShowDialog();
}
Form1 frm = new Form1();
frm.ShowDialog();
frm.Dispose();