如何扩展 WinForm 的 Dispose 方法?

我收到了 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 仍然显示这条消息。我是否已经被覆盖并且我可以安全地忽略它,或者还有其他方法我应该这样做吗?

42099 次浏览

您需要重写 Dispose 方法,此方法为 来自控制中心基类

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

如果 RestartForm 扩展 System。窗户。表格。表单中,您应该能够重写 Dispose (bool 释放)。您应该为您的“ 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);
}

您需要从 Form重写 Dispose方法

通常,这将在 RestartForm 中自动重写。Cs 文件,因此需要将释放移动到代码文件中,以便可以添加需要添加的任何代码,而无需由设计器重写。

在 RestartForm.cs 中

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


// Dispose stuff here
}


base.Dispose(disposing);
}

我使用这种方法:)

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