#430 – A Dispose Pattern Example
October 11, 2011 Leave a comment
If you want to control when an object’s unmanaged resources are released, you can follow the dispose pattern, implementing a Dispose method.
Here’s a complete example. We create a method to release resources that is called either when a client invokes Dispose directly or when the CLR is finalizing the object.
public class Dog : IDisposable
{
// Prevent dispose from happening more than once
private bool disposed = false;
// IDisposable.Dispose
public void Dispose()
{
// Explicitly dispose of resources
DoDispose(true);
// Tell GC not to finalize us--we've already done it manually
GC.SuppressFinalize(this);
}
// Function called via Dispose method or via Finalizer
protected virtual void DoDispose(bool explicitDispose)
{
if (!disposed)
{
// Free some resources only when invoking via Dispose
if (explicitDispose)
FreeManagedResources(); // Define this method
// Free unmanaged resources here--whether via Dispose
// or via finalizer
FreeUnmanagedResources();
disposed = true;
}
}
// Finalizer
~Dog()
{
DoDispose(false);
}
}