WinForms对话框窗体--关闭还是释放?

16
我继承了一些代码,并想请教大家一个修改,我的担忧是内存管理问题。
假设我有一个“基本”表单,其中包含许多按钮,用于打开“对话框”表单。在打开对话框表单方面,有什么推荐的模式?目前,我们在“基本”表单代码中像这样显示“对话框”表单(在按钮单击时):
ChangePasswordForm frm = new ChangePasswordForm();
frm.ShowDialog();
然后这样关闭它(在"dialog"表单代码中):
private void bCancel_Click(object sender, EventArgs e)
{
  this.Close();
  //this.Dispose();  <-- this is what I am considering adding.
}

我添加Dispose的原因是因为我担心如果这个窗体被显示和关闭多次,每次都会创建一个新的窗体实例,而且它的资源从未真正释放--这是正确的吗?此外,如果该窗体有顶部右侧的“关闭”X,我是否也应在FormClosed事件中调用Dispose()方法?

提前致谢。


嗯,我读了这个链接,觉得很有趣。希望能对你有所帮助。 - user935375
2个回答

27

我会使用using语句:

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

结合使用DialogResult:

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

设置DialogResult,将关闭对话框,并且调用者/所有者会得到一些反馈。

而且您不必担心Close或Dispose。


谢谢,是设置DialogResult导致使用块“超出范围”,这么说吗? - mikey
设置DialogResult将关闭对话框,并且ShowDialog调用将返回。ShowDialog以“模态”模式显示窗体,调用代码将被阻塞,直到对话框关闭。 - GvS
可能有些偏题,但如果您在使用Show而不是ShowDialog打开的窗体中设置了DialogResult,该窗体是否仍会关闭? - ShooShoSha
1
@ShooShoSha 设置 DialogResult 会导致用于模态窗体的特殊消息循环停止运行,该消息循环不用于非模态窗体。在非模态窗体上设置 DialogResult 不会关闭窗体。 - GvS

21
根据MSDN的说法,需要在以下两种情况下进行处理:当 (1) 窗体是多文档界面 (MDI) 应用程序的一部分,且该窗体不可见;以及 (2) 使用 ShowDialog 显示了窗体。在这些情况下,需要手动调用 Dispose 方法来标记所有窗体控件以进行垃圾回收。 MSDN Form.Close 使用 using 语句声明窗体会是适当的处理方式。
        using (ChangePasswordForm frm = new ChangePasswordForm())
        {
            frm.ShowDialog();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接