Thursday, 10 July 2014

Dispose

Here's an insight into my 'Dispose' pattern -- so I can copy/paste into my next class :)



/// <summary>Indicates whether or not this object been disposed.</summary>
private bool _disposed;

/// <summary>Implement IDisposable.</summary>
public void Dispose()
{
  Dispose(true);
  GC.SuppressFinalize(this);
}


/// <summary>Dispose of the indicated object while ensuring that the reference is disposed in a thread-safe manner.</summary>
/// <typeparam name="T">The type of object being disposed.</typeparam>
/// <param name="disposableObject">A reference to the object to be disposed.</param>
private static void DisposeOf<T>(ref T disposableObjectwhere T : classIDisposable
{
  var objectToDispose = Interlocked.Exchange(ref disposableObjectnull);
  if (null != objectToDispose)
  {
    objectToDispose.Dispose();
  }
}


/// <summary>
/// Dispose(bool disposing) executes in two distinct scenarios.
/// If disposing equals true, the method has been called directly
/// or indirectly by a user's code. Managed and unmanaged resources
/// can be disposed.
/// </summary>
/// <param name="disposing">
/// If disposing equals false, the method has been called by the
/// runtime from inside the finalizer and you should not reference
/// other objects. Only unmanaged resources can be disposed.
/// </param>
[SuppressMessage("Microsoft.Usage""CA2213:DisposableFieldsShouldBeDisposed"MessageId = "_disposableA"Justification = "Disposed using DisposeOf method.")]
[SuppressMessage("Microsoft.Usage""CA2213:DisposableFieldsShouldBeDisposed"MessageId = "_disposableA"Justification = "Disposed using DisposeOf method.")]
private void Dispose(bool disposing)
{
  // Check to see if Dispose has already been called.
  if (!_disposed)
  {
    // If disposing equals true, dispose all managed
    // and unmanaged resources.
    if (disposing)
    {
      // Call the appropriate methods to clean up
      // unmanaged resources here.


      // Dispose managed resources here
      DisposeOf(ref _disposableA);
      DisposeOf(ref _disposableB);
    }

    // Note disposing has been done.
    _disposed = true;
  }
}

No comments: