c# – 从组件派生并正确实现IDisposable
发布时间:2020-12-15 23:55:18 所属栏目:百科 来源:网络整理
导读:我有一个Visual Studio 2008 C#.NET 2.0 CF项目,其中一个抽象类派生自Component.从该课程中,我得出了几个具体的类(如下面的例子). 但是,当我去退出我的Form时,虽然调用了Form的Dispose()成员并且调用了components.Dispose(),但我的组件从未被释放. 任何人都
我有一个Visual Studio 2008 C#.NET 2.0 CF项目,其中一个抽象类派生自Component.从该课程中,我得出了几个具体的类(如下面的例子).
但是,当我去退出我的Form时,虽然调用了Form的Dispose()成员并且调用了components.Dispose(),但我的组件从未被释放. 任何人都可以建议我如何修复这个设计? public abstract class SomeDisposableComponentBase : Component { private System.ComponentModel.IContainer components; protected SomeDisposableComponentBase() { Initializecomponent(); } protected SomeDisposableComponentBase(IContainer container) { container.Add(this); Initializecomponent(); } private void InitializeComponent() { components = new System.ComponentModel.Container(); } protected abstract void Foo(); #region IDisposable Members bool disposed_; /// Warning 60 CA1063 : Microsoft.Design : Ensure that 'SomeDisposableComponentBase.Dispose()' is declared as public and sealed.* public void Dispose() { // never called Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // never called if (!disposed_) { if (disposing && (components != null)) { components.Dispose(); } disposed_ = true; } base.Dispose(disposing); } #endregion } public SomeDisposableComponent : SomeDisposableComponentBase { public SomeDisposableComponent() : base() { } public SomeDisposableComponent(IContainer container) : base(container) { } protected override void Foo() { // Do something... } protected override void Dispose(bool disposing) { // never called base.Dispose(disposing); } } public partial class my_form : Form { private SomeDisposableComponentBase d_; public my_form() { InitializeComponent(); if (null == components) components = new System.ComponentModel.Container(); d_ = new SomeDisposableComponent(components); } /// exit button clicked private void Exit_Click(object sender,EventArgs e) { this.Close(); } /// from the my_form.designer.cs protected override void Dispose(bool disposing) { if (disposing && (components != null)) { // this function is executed as expected when the form is closed components.Dispose(); } base.Dispose(disposing); } } *我注意到FX-Cop在这里给我一个提示.但是,如果我尝试将该函数声明为密封,我会收到错误: error CS0238: 'SomeDisposableComponentBase.Dispose()' cannot be sealed because it is not an override 将该函数声明为覆盖会导致: 'SomeDisposableComponentBase.Dispose()': cannot override inherited member 'System.ComponentModel.Component.Dispose()' because it is not marked virtual,abstract,or override 谢谢, 解决方法
SomeDisposableComponentBase应覆盖
Component.Dispose(Boolean) .
您还需要删除SomeDisposableComponentBase.Dispose()方法(不带参数),because it hides the using (Component component = new SomeDisposableComponent()) { // Calls Component.Dispose upon exiting the using block } using (SomeDisposableComponentBase component = new SomeDisposableComponent()) { // Calls SomeDisposableComponentBase.Dispose upon existing the using block } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |