【问题标题】:How do I extend a WinForm's Dispose method?如何扩展 WinForm 的 Dispose 方法?
【发布时间】:2010-11-06 07:59:18
【问题描述】:

我收到了来自 FxCop 的警告:

“'RestartForm' 包含 IDisposable 类型的字段 'RestartForm.done':'ManualResetEvent'。将 'RestartForm' 上的 Dispose 方法更改为在该字段上调用 ​​Dispose 或 Close。”

好的,我明白这意味着什么以及为什么需要这样做...除了System.Windows.Forms.Form 不允许您覆盖.Close().Dispose(),那该怎么办?目前我正在使用这个解决方案:

    private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
    {
        done.Set();
        done.Close();
    }

这符合我的应用程序的预期...但 FxCop 仍然显示此消息。我是否被覆盖了,我可以安全地忽略它,还是有其他方法可以做到这一点?

【问题讨论】:

  • 如果您不想接触设计器生成的代码,也可以在构造函数中订阅 Disposed 事件。

标签: c# winforms dispose fxcop


【解决方案1】:

您需要从Form 覆盖Dispose 方法

这通常会在 RestartForm.Designer.cs 文件中自动覆盖,因此您需要将 dispose 移动到您的代码文件中,以便您可以添加任何需要添加的代码,而无需设计器重写。

在RestartForm.cs中

protected override void Dispose(bool disposing)
{
  if (disposing)
  {
    if (components != null)
    {
      components.Dispose();
    }

    // Dispose stuff here
  }

  base.Dispose(disposing);
}

【讨论】:

  • 这正是我所缺少的……我什至没有想过要检查设计者是否将其放入了自动生成的代码中……解释了为什么它不在覆盖列表中,它已经实现了,只是不是我做的!
  • 如果disposingcomponents != null 在同一行进行评估,我应该把我的处置材料放在哪里?例如。 if (disposing && (components != null))(vs2013默认)
  • @firsttimer,逻辑是一样的。您需要将该方法移出设计器文件,然后分解条件。完成后,您的代码应该类似于我上面的示例。
【解决方案2】:

我用这个方法:)

            Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
            currentButton.Image = bgImage;
            currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();

【讨论】:

  • 这不会让您有一个要取消订阅的事件接收器,因为您已经处理了表单,因此您会面临资源泄漏?
  • 不,没关系。如果订阅的类没有绑定另一个正在运行的类,它将自动解绑。
【解决方案3】:

如果 RestartForm 扩展 System.Windows.Forms.Form,您应该能够覆盖 Dispose(bool disposing)。你应该为你的“RestartForm”类正确实现这个来处理你的 IDisposables。

应该是这样的:

public override Dispose(bool disposing)
{
   if (disposing)
   {
       // Dispose was called from user code. Dispose of managed resources here.
       done.Dispose();
   }

   // Dispose of unmanaged resources here, and invoke base dispose.
   base.Dispose(disposing);
}

【讨论】:

    【解决方案4】:

    需要重写Dispose方法,这个方法comes from the Control基类

    protected override void Dispose(bool disposing)
    {
      if (disposing)
      {
        event.Dispose();
      }
      base.Dispose(disposing);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-14
      相关资源
      最近更新 更多