Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Finalizers with Dispose() in C#

See the code sample from MSDN: (http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx)

// Design pattern for a base class.
public class Base: IDisposable
{
  private bool disposed = false;

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

  protected virtual void Dispose(bool disposing)
  {
      if (!disposed)
      {
          if (disposing)
          {
              // Free other state (managed objects).
          }
          // Free your own state (unmanaged objects).
          // Set large fields to null.
          disposed = true;
      }
  }

  // Use C# destructor syntax for finalization code.
  ~Base()
  {
      // Simply call Dispose(false).
      Dispose (false);
  }
}

In the Dispose() implementation it calls GC.SupressFinalize();, but provide a destructor to finalise the object.

What is the point of providing an implementation for the destructor when GC.SuppressFinalize() is called?

Just little bit confused what the intentions are?

like image 924
msuhash Avatar asked Dec 16 '22 20:12

msuhash


2 Answers

There are 2 scenarios:

  • Your code calls Dispose (preferred) and the Finalizer is canceled, eliminating the overhead.
  • Your code 'leaks' the object and the GC calls the Finalizer.
like image 144
Henk Holterman Avatar answered Dec 28 '22 06:12

Henk Holterman


If someone forgets to call Dispose, the finalizer will (eventually) run to do final cleanup. Since finalization hurts performance, ideally no-one will forget to Dispose. The using construct helps a little with that.

like image 39
Kate Gregory Avatar answered Dec 28 '22 06:12

Kate Gregory