不提供受保护的Dispose(bool)方法的基类?

时间:2015-03-02 10:46:09

标签: c# dispose

MS建议基类应在派生类中提供protected virtual void Dispose(bool disposing)。我有一个早期编写的类,它没有提供这样的功能。通过知道事实基类是Disposable,我们可以在任何派生类中使用以下内容吗?

class Base : IDisposable
{
    //This somehow disposes it's resources
}

class Derived : Base
{
    bool disposed;
    private void PrivateDispose(bool disposing)
    {
      if (disposed) return;
      if (disposing) {
          // Cleanup managed resources
          // ...

          // Simply dispose base class
          base.Dispose();
      }
      // Cleanup unmanged resources if any
      // ...

      disposed = true; 
    }

    public void Dispose()
    {
        PrivateDispose(true);
        GC.SuppressFinalize(this);
    }

    // Only provide Finalizer if we have unmanaged resources
    ~Derived()
    { 
        PrivateDispose(false);
    } 
}

1 个答案:

答案 0 :(得分:3)

是的,你可以。 MS推荐这一点的原因是为了使派生类型的任何实施者能够轻松覆盖现有的Dispose(bool disposing)方法,因为public void Dispose()接口实现的IDisposable不是virtual 1}}。

请注意,应该使用此模式。变化:

private void PrivateDispose(bool disposing)

要:

protected virtual void Dispose(bool disposing)

因此,如果有人可能需要扩展您的类,他可以简单地覆盖您的方法。

一般来说,here are some more guidelines for implementing IDisposable

  

处置应符合以下条件:

     

1)可以多次安全地调用   2)释放任何资源   与实例相关联   3)调用基类的Dispose方法,   如有必要的话   4)禁止完成此类以帮助GC   减少       终结队列中的对象数量   5)处理通常不应抛出异常,除非非常严重   特别意外的错误(即OutOfMemoryException)。   理想情况下,通过调用Dispose,您的对象不会出错。