如何扩展WinForm的Dispose方法?

Mat*_*ley 62 c# dispose fxcop winforms

我从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();
    }
Run Code Online (Sandbox Code Playgroud)

这适用于我的应用程序...但FxCop仍然显示此消息.我是否被覆盖,我可以安全地忽略它,还是我应该采取另一种方式做到这一点?

hea*_*vyd 107

您需要覆盖该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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这正是我所遗漏的......我甚至没想过要检查设计师是否将它放入了自动生成的代码中...解释为什么它不在覆盖列表中,它已经实现,只是没有通过我! (5认同)

Ale*_*heo 8

我用这个方法:)

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