Skip to main content

Finalize, Dispose and Unmanaged Resources


There may be situations where some class has control over resources that are not managed by the runtime such as window handles, database connections, etc. and these resources need to be released as they occupy more memory or affect performance. It can be done explicitly by calling Dispose () to release these objects immediately when they are no more needed. Similarly these objects can also be released implicitly by implementing Finalize() so that they get collected by GC in case someone forgets to call dispose () on these objects. Also since calling Finalize impacts the performance, calls to Finalize can be prevented by invoking the GC.SuppressFinalize method but it should be made sure that it only gets called after Dispose method has completed successfully.

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 managed objects.
       }
       // Free unmanaged objects.
       disposed = true;
    }
}
     // using destructor for finalization.
    ~Base()
    {
        Dispose (false);
     }
}

Public class Derived: Base
{
     Private bool disposed = false;
     Protected override void Dispose(bool disposing)
     {
          if (!disposed)
         {
             if (disposing)
            {
                 // Release managed resources.
             }
             // Release unmanaged resources
             disposed = true;
        }
        base.Dispose(disposing);
     }
}

Public class Test
{
      Public static void Main()
      {
          //Scenario#1
          // Dispose is not called; Finalize will be called
          Derived a1 = new Derived();
          . . . . . . . .

          //Scenario#2
          //Dispose is implicitly called in the scope of the using statement.
          using (Derived a2 = new Derived())
          {
                . . . . . . . .
           }

          //Scenario #3
          // Dispose is explicitly called.
          Derived a3 = new Derived();
          . . . . . . . .
          a3.Dispose();
      }
 }

In the above example, object a2 and a3 are released by calling Dispose method of the base class as a result of which the overloaded dispose method of the derived class and then the base class dispose method gets called to release the managed and unmanaged resources .It can be also noted that the call to finalize() has been suppressed at the end of dispose. In case of object a1, since dispose() method is not called explicitly, finalize method gets called by GC which in turn calls the dispose method of derived class where the unmanaged resources gets released.

Comments

Popular posts from this blog

C# Generic Factory

Implement Factory pattern using generics     public interface IDoWork   {       string DoWork();   }     Declare an Interface first by abstracting the common  functionality    Here I am taking the example of DoWork     public class Manager : IDoWork   {     public string DoWork()     {         return "Manager Manages School" ;     }   }     Implement the IDoWork in concrete classes as shown      public class Teacher : IDoWork     {         public string DoWork()         {             return "Teacher teaches student in school" ;         ...

How to enable windows authentication in PostgreSQL

1.     Steps to create user or role in PostgreSQL ·         Open pgAdmin III ·         Login to PostgreSQL database ·         Select “Login Roles” and right click on mouse to view the context menu ·         Select “New Login Role” from context menu ·         Enter desired user name in “Role name” text box ·         Select “Definition” tab in “New Login Role” window ·         Enter desired Password in the given text box ·         Select “Role privileges” tab in “New Login Role” window ·         Select the privileges for the entered user or role ·         Select “SQL”...

UML - Association, Aggregation, Composition, Generalization, Specialization, Realization and Dependency

Association Association is a simple relationship between two classes. For example A relationship between Professor Class and Student class is known as Association. Both Classes can exist without each other, so Professor and Student are two independent classes. In this kind of relationships there will not be any owner class. Both classes have their own life cycle. UML Notation:     Aggregation Aggregation is a special type of Association. It is known as “Has-A” relationship. For example A Department class can contain Professor Class. Here Department class is owner class. Here in this relationship even after deleting Department class, Professor Class can exits. UML Notation: Composition Composition is a special type of Aggregation. It is known as “Is-A” relationship. For example A University Class has many Department class. Here University and Department objects are dependent on each other. If we delete Univ...