Use the Dispose Pattern for Deterministic Destruction

You can implement a finalizer in a class to explicitly release unmanaged resources before an object’s memory is freed.  Drawbacks of this approach include:
  • You don’t control when the object’s resources are cleaned up
  • A finalizer can’t make use of any other managed objects  (they may have already been finalized)
Another pattern for releasing unmanaged resources is for a class to implement the IDisposable interface by providing aDispose method.  Dispose is meant to clean up the object’s resources when it’s called.  A client of the class can decide exactly when it wants to release the object’s resources (deterministic destruction).  Benefits of this pattern include:
  • Can release resources earlier, not waiting for finalization
  • Dispose logic can make use of other managed resources


1
2
3
4
5
6
7
8
public class Dog : IDisposable
{
    public void Dispose()
    {
        // Release unmanaged resources here
 
        // Note: need logic to prevent double disposal, etc.
    }