What is Idisposable interface & Finalize Dispose pattern ?

Csharp By Sagar Jaybhay

In this article we will understand what is the use of IDisposable interface and how Finalize Dispose pattern will implement in C# By Sagar Jaybhay.

Idisposable interface and Finalize Dispose pattern

Garbage collector only cleans managed code and if any unmanaged code it finds it doesn’t reclaim its memory so to remove unused objects we need something. In this case, at least we have a responsibility to call these kinds of which free unmanaged code objects. In C# application there is a place where we can manage these unmanaged objects and this place is a destructor.

But in Garbage collection destructor creates some problem which we solve by using an IDisposable Dispose pattern.

When I write destructor then more and more objects are created in Gen1 and Gen2 so which is not good in performance point of view.

Object creation On The Heap
Object creation On The Heap

In the above image, most of the objects are created in gen2. And code for this is below

   public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 1000000; i++)
            {
                XYZ x = new XYZ();
            }

            MessageBox.Show("Completed");
        }
    }

    class XYZ
    {
        public int i { get; set; }
        public string str { get; set; }

        public void append()
        {
            for (int i = 0; i < 1000; i++)
            {
                str += i;
            }
        }

        ~XYZ() { }

    }

In below class, we implement IDisposable pattern

public partial class Form1: Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 0000001; i++)
            {
                XYZ x = new XYZ();
                x.Dispose();
            }

            MessageBox.Show("Completed");
        }
    }

    class XYZ: IDisposable
    {
        public int i { get; set; }
        public string str { get; set; }

        public void append()
        {
            for (int i = 0; i < 1000; i++)
            {
                str += i;
            }
        }

        ~XYZ() {
            //release unmanaged objects
            Dispose(false);
        }

        private void ReleaseUnmanagedResources()
        {
            // TODO release unmanaged resources here
        }

        protected virtual void Dispose(bool disposing)
        {
            ReleaseUnmanagedResources();
            if (disposing)
            {
            }
        }

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

 GC.SuppressFinalize(this);

This will suppress any kind of destructor and clean object.


GitHub Projects Link : – https://github.com/SagarJaybhay/DotNetDemos


Sagar Jaybhay, from Maharashtra, India, is currently a Senior Software Developer. He has continuously grown in the roles that he has held in the more than seven years he has been with this company. Sagar Jaybhay is an excellent team member and prides himself on his work contributions to his team and company as a whole.

Related posts

Leave a Comment