CA2215: Dispose methods should call base class dispose
TypeName | DisposeMethodsShouldCallBaseClassDispose |
CheckId | CA2215 |
Category | Microsoft.Usage |
Breaking Change | Non Breaking |
A type that implements System.IDisposable inherits from a type that also implements IDisposable. The Dispose method of the inheriting type does not call the Dispose method of the parent type.
It is safe to suppress a warning from this rule if the call to base.Dispose occurs at a deeper calling level than the rule checks.
The following example shows a type TypeA that implements IDisposable.
using System; namespace UsageLibrary { public class TypeA :IDisposable { protected virtual void Dispose(bool disposing) { if (disposing) { // Dispose managed resources } // Free native resources } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } // Disposable types implement a finalizer. ~TypeA() { Dispose(false); } } }
The following example shows a type TypeB that inherits from type TypeA and correctly calls its Dispose method.
Complete example in C#
taken from - http://msdn.microsoft.com/en-us/library/b1yfkh5e.aspx
// Design pattern for a base class.
public class Base: IDisposable
{
private bool disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
// Design pattern for a derived class.
public class Derived: Base
{
private bool disposed = false;
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Release managed resources.
}
// Release unmanaged resources.
// Set large fields to null.
// Call Dispose on your base class.
disposed = true;
}
base.Dispose(disposing);
}
// The derived class does not have a Finalize method
// or a Dispose method without parameters because it inherits
// them from the base class.
}
// Design pattern for a base class.
public class Base: IDisposable
{
private bool disposed = false;
//Implement IDisposable.
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Free other state (managed objects).
}
// Free your own state (unmanaged objects).
// Set large fields to null.
disposed = true;
}
}
// Use C# destructor syntax for finalization code.
~Base()
{
// Simply call Dispose(false).
Dispose (false);
}
}
// Design pattern for a derived class.
public class Derived: Base
{
private bool disposed = false;
protected override void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// Release managed resources.
}
// Release unmanaged resources.
// Set large fields to null.
// Call Dispose on your base class.
disposed = true;
}
base.Dispose(disposing);
}
// The derived class does not have a Finalize method
// or a Dispose method without parameters because it inherits
// them from the base class.
}
- 12/16/2010
- akjoshi