public abstract class DisposablePattern : IDisposable { protected abstract void FreeManaged(); protected abstract void FreeUnmanaged(); private bool disposed; protected void CheckDisposed() { if( disposed ) throw new ObjectDisposedException( GetType().Name ); } public void Dispose() { Dispose( true ); GC.SuppressFinalize( this ); } protected virtual void Dispose( bool disposing ) { if( !disposed ) { if( disposing ) FreeManaged(); FreeUnmanaged(); disposed = true; } } ~DisposablePattern() { Dispose( false ); } }