关闭后是否需要“处置”“ Windows.Form”?

时间:2019-11-05 17:36:02

标签: c# winforms

我的应用程序有两种不同的形式;

  1. 主要申请表
  2. 另一种显示警告,信息,错误等的消息(仅在需要时显示)。

在表单1(应用程序的主表单)中,第二行的表单如下所示;

FormMain:

...
if (sth_goes_wrong) {
    this.formWarn = new FormWarn("explanatory message...");
    this.formWarn.Dispose(); // <- this is the line in question
}
...

FormWarn:

internal class FormWarn : Form {
    ...
    public FormWarn(String msg) {
        this.SetupStuff();
        this.btnOk.Click += FormWarn_BtnOkClick;
        ...
        this.ShowDialog();
    }

    private FormWarn_BtnOkClick(Object sender, EventArgs e) {
        ...
        this.Close();
    }
    ...
}

警告形式显示为“对话框”,并且用户在阅读消息后,应该按下按钮(btnOk),该按钮将程序流发送到使用Close()方法的一行。

我的问题是; (在Close()类中的FormWarn方法是否负责释放资源,还是返回主表单后我需要使用Dispose()方法?

1 个答案:

答案 0 :(得分:0)

一般规则是任何要实施IDisposable的东西。这包括表格,因为基数FormIDisposable。此外,即使在例外情况下,也应采取措施确保处置。因此,更好的模式通常如下所示:

if (sth_goes_wrong) {
    using (var formWarn = new FormWarn("explanatory message..."));
    {
        formWarn.ShowDialog();
    }
}

请注意,我没有使用成员变量,而是通过阻止对话框显示了表单。

或者,您可以继续使用成员变量。但是,在那种情况下,您需要重写当前表单的Dispose()方法以处置您的formWarn实例(如果存在),并且所讨论的代码应如下所示:

if (sth_goes_wrong) {
    this.formWarn = this.formWarn ?? new FormWarn();
    formWarn.Message = "explanatory message..."; 
    formWarn.Show();
}

还添加了新的Message属性,使您可以更新现有实例。