public class DisposableClass : IDisposable { private bool _disposed = false; public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected virtual void Dispose(bool disposing) { // Note that Dispose() is not thread-safe in this form! // If thread-safety is required, you need to implement this. if (!_disposed) { if (disposing) { // Dispose managed resources. } // Release unmanaged resources. } _disposed = true; } ~DisposableClass() { Dispose(false); } public void SomeMethod() { if (this._disposed) { throw new ObjectDisposedException(this.GetType().Name); } } } public class DisposableSubClass : DisposableClass { private bool _disposed = false; protected override void Dispose(bool disposing) { if (!_disposed) { try { if (disposing) { // Release the managed resources you added in // this derived class here. } // Release the native unmanaged resources you added // in this derived class here. _disposed = true; } finally { // Call Dispose on your base class. base.Dispose(disposing); } } } }
using (DisposableClass c = new DisposableClass()) { c.SomeMethod(); }