Thursday, February 13, 2020

What is Idisposable interface and Finalize Dispose pattern By Sagar Jaybhay


Garbagecollector 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



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.




No comments:

Post a Comment