2010-05-20 45 views
3

我有一个Visual Studio 2008 C#.NET 2.0 CF项目,其中包含一个派生自组件的抽象类。从这个类中,我得到了几个具体的类(如下面的例子)。 但是,当我退出我的表单时,尽管调用了Form的Dispose()成员并调用了components.Dispose(),但我的组件始终不会被处理。从组件派生并正确实现IDisposable

有人可以建议我如何修复这种设计?

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 

感谢, PaulH

回答

7

SomeDisposableComponentBase应该重写Component.Dispose(Boolean)

您还需要删除SomeDisposableComponentBase.Dispose()方法(不带参数),because it hides the Component.Dispose implementation,所以他们视为不同的方法,这取决于你如何声明变量:

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 
} 
5

正在发生的事情是,编译器解释方法上SomeDisposableComponentBase电池作为

new public void Dispose() 
{ 
    // never called 
    Dispose(true); 
    GC.SuppressFinalize(this); 
} 

这是不是一种超越,这是给一个新的语义你的类层次结构内的现有名称。因此,实际上您正在创建一个与Component.Dispose不同的新Dispose方法。

检查Implementing Finalize and Dispose to Clean Up Unmanaged Resources文章为官方指导如何实现IDisposable.Dispose方法。

+0

你说得对,我会删除我答案的最后一部分。谢谢。 – 2010-05-20 15:58:18

+0

我欣赏那个链接。我以前没见过它,而且内容非常丰富。谢谢。 – PaulH 2010-05-21 15:20:17