【问题标题】:Does a "Windows.Form" need to be "disposed" after being closed? [duplicate]关闭后是否需要“处置”“Windows.Form”? [复制]
【发布时间】:2019-11-05 17:36:02
【问题描述】:

我的申请有两种不同的形式;

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

在form 1(应用程序的主窗体)中,在不同的行中调用了第二个form,如下所示;

FormMain:

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

表单警告:

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() 方法?

【问题讨论】:

  • @EdPlunkett:FormWarn 的类型为 Windows.Forms。我的意思是,它的类被定义为internal class FormWarn : Form {...。所以,是的;它是一个 IDisposable 类型。
  • 表单类可以在没有帮助的情况下自行处理,除非它使用 ShowDialog() 显示。然后它不会,在已处理的表单对象上检索对话框属性太冒险了。在这种情况下,你总是使用using,从不使用 Dispose()。

标签: c# winforms


【解决方案1】:

一般规则是 anything 实现IDisposable 应该被处置。这包括表单,因为基础 Form 是 IDisposable。此外,应采取措施确保即使在异常情况下也能进行处置。因此,更好的模式通常如下所示:

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 属性,允许您更新现有实例。

【讨论】:

  • 好的,知道了。另一个问题,如果您不介意的话:这个FormWarn 在一小时内显示 10 到 20 次。在这种情况下,我应该更喜欢哪个选项?依靠垃圾收集器,我应该每次都关闭并处理表单还是创建一次并仅通过更改消息继续显示相同的表单更好?
  • 如果您对模式对话框感到满意,我会创建新实例,因为这不太可能提高整体性能并且代码更简单。如果您对这种情况下的模式对话框不满意,我会创建一个默认/共享实例。此外,对于一个长时间运行的应用程序,您可以忽略处理应该在应用程序的整个生命周期中可用的单个实例的需要。或者更确切地说,您可以依靠整个应用程序的拆除来最终处置此实例,而不是您自己的代码。但是您也必须非常小心,这确实是正确的。
猜你喜欢
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
  • 2019-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多