没有提供受保护的Dispose(bool)方法的基类是什么?

3

微软建议在派生类中提供protected virtual void Dispose(bool disposing)来实现基类。我有一个较早的已有类,没有提供这样的函数。知道基类是可释放的,我们能否在任何派生类中简单地使用以下代码?

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);
    } 
}

你为什么要在.NET 2.0及更高版本中使用那种模式? - CodesInChaos
1个回答

3

是的,你可以这样做。微软推荐这样做的原因是为了让任何派生类型的实现者能够轻松地覆盖现有的Dispose(bool disposing)方法,因为由IDisposable接口实现的public void Dispose()不是virtual的。

请注意,你应该使用这种模式。更改为:

private void PrivateDispose(bool disposing)

致:

protected virtual void Dispose(bool disposing)

所以如果有人需要扩展你的类,他可以简单地覆盖你的方法。

一般来说,以下是实现IDisposable的一些指导方针:

Dispose应该满足以下条件:

1)可安全地被多次调用
2)释放与实例相关联的任何资源
3)如有必要,请调用基类的Dispose方法
4)抑制此类的终结以帮助GC通过减少终结队列上的对象数量。
5)Dispose通常不应该抛出异常,除非是非常严重的意外错误(例如OutOfMemoryException)。理想情况下,通过调用Dispose,不应该出现任何问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接