Search code examples
c#.netoopidisposable

IDisposable with Multiple Levels of Inheritance


Suppose you have the following inheritance chain:

class A : IDisposable
{
    public void Dispose()...
    protected virtual void Dispose(bool disposing)...
}

class B : A
{
    // Virtual or Override for B?
}

class C : B
{
    protected override void Dispose(bool disposing)...
}

If A, B, and C each have their own private IDisposable resources, how should B declare Dispose(bool)?


Solution

  • You should override, not hide:

    class A : IDisposable
    {
        public void Dispose() {
          Dispose(true);
          GC.SuppressFinalize(this); // <- May be excluded
        }
    
        protected virtual void Dispose(Boolean disposing)... // <- "disposing" recommended by Microsoft
    }
    
    class B : A
    {
        protected override void Dispose(Boolean disposing) {
          // Dispose here all private resources of B
          ...
          base.Dispose(disposing);
        }
    }
    
    class C : B
    {
        protected override void Dispose(Boolean disposing) {
          // Dispose here all private resources of C
          ...
          base.Dispose(disposing);
        }
    }