C# 如何扩展WinForm';什么样的处理方法?
我从FxCop收到以下警告: “RestartForm”包含IDisposable类型的字段“RestartForm.done:“ManualResetEvent”。请更改“RestartForm”上的Dispose方法以调用此字段上的Dispose或Close。” 好的,我明白这意味着什么,为什么这是需要做的。。。除了C# 如何扩展WinForm';什么样的处理方法?,c#,winforms,dispose,fxcop,C#,Winforms,Dispose,Fxcop,我从FxCop收到以下警告: “RestartForm”包含IDisposable类型的字段“RestartForm.done:“ManualResetEvent”。请更改“RestartForm”上的Dispose方法以调用此字段上的Dispose或Close。” 好的,我明白这意味着什么,为什么这是需要做的。。。除了System.Windows.Forms.Form不允许您重写.Close()或.Dispose(),该怎么办?目前我正在运行此解决方案: private void Re
System.Windows.Forms.Form
不允许您重写.Close()
或.Dispose()
,该怎么办?目前我正在运行此解决方案:
private void RestartForm_FormClosing(object sender, FormClosingEventArgs e)
{
done.Set();
done.Close();
}
按照我的应用程序的预期工作。。。但FxCop仍然显示了这一信息。我是否被覆盖并且可以安全地忽略它,或者是否有其他方法可以做到这一点?您需要重写Dispose方法,这个方法基类
protected override void Dispose(bool disposing)
{
if (disposing)
{
event.Dispose();
}
base.Dispose(disposing);
}
如果RestartForm扩展了System.Windows.Forms.Form,您应该能够覆盖Dispose(bool disposing)。您应该为“RestartForm”类正确实现这一点,以处理IDisTables 它应该是这样的:
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);
}
您需要从
表单
通常,这会在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);
}
我用这个方法:)
这正是我所缺少的。。。我甚至没想过要检查设计师是否把它放在自动生成的代码中。。。解释了为什么它不在覆盖列表中,它已经实现了,只是不是由我实现的!如果
disposing
和组件!=null
是否在同一行计算?例如,如果(disposing&&(components!=null))
(vs2013的默认值)@firsttimer,则逻辑相同。您需要将该方法移出设计器文件,然后分解条件。完成后,您的代码应该与上面的示例类似。如果您不想接触设计器生成的代码,您还可以在构造函数中订阅Disposed event。这不就是给您留下一个事件接收器来取消订阅,让您面临资源泄漏,因为您已经处理了表单吗?不,这不重要。如果订阅的类没有其他正在运行的类绑定到它,它将自动解除绑定。
Image bgImage = Image.FromFile(workingDir + "\\" + button.BackgroundImage);
currentButton.Image = bgImage;
currentButton.Disposed += (Object sndr, EventArgs evnt) => bgImage.Dispose();