如何扩展WinForm的Dispose方法?

时间:2009-06-27 05:05:39

标签: c# winforms dispose fxcop

我收到了来自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仍然显示此消息。我是否被覆盖,我可以安全地忽略它,还是我还有另一种方法可以做到这一点?

4 个答案:

答案 0 :(得分:99)

您需要覆盖Dispose

中的Form方法

通常会在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);
}

答案 1 :(得分:8)

我使用这种方法:)

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

答案 2 :(得分:2)

如果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);
}

答案 3 :(得分:0)

您需要覆盖Dispose方法,此方法comes from the Control基类

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