Naz-Tek Services, Inc.

Writing Software To Provide Strategic Advantage

Home     Development Guidelines     Design Patterns     Knowledgebase     Trainingbase     Blog Feed     Events     Tools     About Us     Contact Us      
Memory Management     Event Handling     Multi-Threading     Serialization      

Cleanup is only necessary in Dot Net to release unmanaged resources.  There are two types of cleanup:

·         Explicit cleanup, implement IDisposable.  Use this method

o        To provide clients of your class a way to cleanup on demand instead of waiting for the garbage collector.

o        When your class holds an indirect reference to an unmanaged resource, e.g., any managed object that has a Dispose() method.

·         Implicit cleanup, implement destructor, e.g., ~ClassName().  Use this method

o        When your class holds a direct reference to an unmanaged resource, e.g., a window handle.

 

A cleanup design pattern is laid out by Microsoft at http://msdn2.microsoft.com/en-us/library/b1yfkh5e(VS.71).aspx and is as follows:

 

[C#]

// Design pattern for a base class.

public class Base: IDisposable

{

   //Implement IDisposable.

   public void Dispose()

   {

     Dispose(true);

      GC.SuppressFinalize(this);

   }

 

   protected virtual void Dispose(bool disposing)

   {

      if (disposing)

      {

         // Free other state (managed objects).

      }

      // Free your own state (unmanaged objects).

      // Set large fields to null.

   }

 

   // Use C# destructor syntax for finalization code.

   ~Base()

   {

      // Simply call Dispose(false).

      Dispose (false);

   }

  

// Design pattern for a derived class.

public class Derived: Base

{  

   protected override void Dispose(bool disposing)

   {

      if (disposing)

      {

         // Release managed resources.

      }

      // Release unmanaged resources.

      // Set large fields to null.

      // Call Dispose on your base class.

      base.Dispose(disposing);

   }

   // The derived class does not have a Finalize method

   // or a Dispose method with parameters because it inherits

   // them from the base class.

}