How to guarantee memory cleanup using Dispose()


  
It's been said that Dispose() function cleans up the memory utilized by objects. Now consider a scenario where you have created an instance. 


.Net CLR may eventually call its Finalize() method, but Dispose() is never called automatically. Calling Dispose() method is the responsibility of consumer of your instance.

Now let's say you have called Dispose method explicitly. In the flow of execution if any exception is thrown before reaching to the call to Dispose() method, the memory leak can arise.

To resolve this issue C# provides a using keyword. Advantages of making use of using keyword it calls the Dispose() method in finally block. You can verify the code in MSIL.


try
{
}
finally
{
    IL_0010: 1dloc.0
    IL_0011: brfalse.s IL_0019
    IL_0013: ldloc.0
    IL_0014: callvirt instance void [mscorlib]system.IDisposable::dispose()
    IL_0019:endfinally
}

//Test.cs
using System;

namespace DisposePattern
{
    class Test
    {
        [STAThread]
        static void Main(string[] args)
        {
            using(Derived object1 = new Derived(1))
            {
                Derived object2 = new Derived(2);
            }
        }
    }
}

You can declare more than one reference in the using declaration: using(Derived obj1 = new Derived(1), obj2 = new Derived(2)) The Dispose() method, in this case, will be called on each referenced object at the appropriate time. You can also achieve this without making use of using keyword. What you have to do is to call Dispose() in finally block. The using keyword in C# improves your chances of cleaning up your resources properly.

No comments:

Post a Comment

Labels

.net .Net Instrumentation logging .net localization Agile amazon amazon elasticache amazon services AppDomain Application Domain architecture asp ASP.Net authentication authentication mechanisms Byte order mark c# cache cdata certifications class classic mode cloud cloud computing cluster code-behind Combobox compilation Configuration providers configurations connection connectionString constructors control controls contructor CSV CTS .net types conversion database DataGridView DataSource DataTable DataType DBML delegates design pattern dispose double encoding Entity framework Events exception handling expiry fault contracts fault exceptions function pointers functions generics help HostingEnvironmentException IIS inner join instance management integrated mode javascript join left outer join LINQ LINQ join LINQ to SQL memory leak methods microsoft modes in IIS MSIL multiple catch blocks no primary key Nullable Osmos Osmotic Osmotic communication Osmotic communications page events page life cycle partial class PMI preserve precision points private contructor ProcessExit Project management properties property protect connectionString providerName providers query regular expression repository Responsive Web Design return type run-time RWD Saas self join session session expiry sessions singelton singleton pattern software as a service source control system SQLMetal string toolstrip ToolStrip controls ToolStripControlHost tortoise SVN ToString() try catch finally update wcf web application web design web site web.config where-clause xml