C# 是否有一个;Windows.Form";需要是;“已处置”;关门后?

C# 是否有一个;Windows.Form";需要是;“已处置”;关门后?,c#,winforms,C#,Winforms,我的申请有两种不同的形式 主要申请表 另一个显示警告、信息、错误等(仅在需要时) 在表单1(应用程序的主表单)中,第二个表单以不同的行调用,如下所示 FormMain: ... if (sth_goes_wrong) { this.formWarn = new FormWarn("explanatory message..."); this.formWarn.Dispose(); // <- this is the line in question } ... 中的警告表

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

  • 主要申请表
  • 另一个显示警告、信息、错误等(仅在需要时)
  • 在表单1(应用程序的主表单)中,第二个表单以不同的行调用,如下所示

    FormMain:

    ...
    if (sth_goes_wrong) {
        this.formWarn = new FormWarn("explanatory message...");
        this.formWarn.Dispose(); // <- this is the line in question
    }
    ...
    
    中的警告表单显示为“对话框”,用户在阅读消息后,应按下按钮(btnOk),该按钮将程序流发送到使用
    Close()
    方法的行


    我的问题是,;
    Close()
    方法(在
    FormWarn
    类中)是用来释放资源还是在返回主窗体后需要使用
    Dispose()
    方法?

    一般规则是任何实现
    IDisposable
    都应该被释放。这包括表单,因为基本
    表单
    IDisposable
    。此外,应采取步骤确保即使在出现例外情况时也能进行处置。因此,更好的模式通常如下所示:

    if (sth_goes_wrong) {
        using (var formWarn = new FormWarn("explanatory message..."));
        {
            formWarn.ShowDialog();
        }
    }
    
    if (sth_goes_wrong) {
        this.formWarn = this.formWarn ?? new FormWarn();
        formWarn.Message = "explanatory message..."; 
        formWarn.Show();
    }
    
    注意,我没有使用成员变量,而是使用阻塞对话框显示表单

    或者,可以继续使用成员变量。但是,在这种情况下,您需要重写当前表单的
    Dispose()
    方法来同时处理
    formWarn
    实例(如果它存在),并且相关代码应该如下所示:

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

    您还添加了新的
    消息
    属性,允许您更新现有实例。

    @EdPlunkett:
    FormWarn
    类型为
    Windows.Forms
    。我的意思是,它的类被定义为
    内部类FormWarn:Form{…
    。因此,是的;它是一个IDisposable类型。Form类可以在没有帮助的情况下自行处理,除非它使用ShowDialog()显示。否则,检索已处理表单对象上的对话框属性风险太大。在这种情况下,始终使用
    using
    ,决不要Dispose()。好的,明白了。如果你不介意的话,再问一个问题:这个
    FormWarn
    在一小时内显示10到20次。在这种情况下,我应该选择哪种选项?依靠垃圾收集器,我应该每次关闭并处理表单,还是创建一次并通过更改消息继续显示同一表单更好?如果是的话如果您对模式对话框感到满意,我会创建新实例,因为这不太可能提高整体性能,代码也比较简单。如果您对这种情况下的模式对话框感到不满意,我会创建一个默认/共享实例。此外,对于长时间运行的应用程序,您可以忽略处理单个实例的需要hat应该在应用程序的整个生命周期中都可用。或者更确切地说,您可以指望拆除整个应用程序来最终处置此实例,而不是您自己的代码。但您也必须非常小心,这确实是正确的。