ASP - Creating Dispose MEthod of my own. - Asked By theiry henry on 25-Nov-09 01:24 AM

i hav created a class. I want to clear the resources of class obj itself after creating my own method of Dispose().
How to do it ?

Use IDisposable - Huggy Bear replied to theiry henry on 25-Nov-09 01:54 AM

You should use the interface IDisposable for implementing the dispose method for you class. Below sample class will tell you how to do it.

    public class MyClass : IDisposable
    {
        private MyClass()
        {
        }

        #region IDisposable Members
//this method will dispose the resources used.
        public void Dispose()
        {
            //Dispose all the resources in here
            //do a 
            GC.Collect();
        }

        #endregion
    }

The MSDN Library has an example on how to do it. - Michael Detras replied to theiry henry on 25-Nov-09 02:55 AM

I copied the C# example from the MSDN Library under the IDisposable interface topic. This also provides some brief explanations.

using System;
using System.ComponentModel;

// The following example demonstrates how to create
// a resource class that implements the IDisposable interface
// and the IDisposable.Dispose method.

public class DisposeExample
{
    // A base class that implements IDisposable.
    // By implementing IDisposable, you are announcing that
    // instances of this type allocate scarce resources.
    public class MyResource: IDisposable
    {
        // Pointer to an external unmanaged resource.
        private IntPtr handle;
        // Other managed resource this class uses.
        private Component component = new Component();
        // Track whether Dispose has been called.
        private bool disposed = false;

        // The class constructor.
        public MyResource(IntPtr handle)
        {
            this.handle = handle;
        }

        // Implement IDisposable.
        // Do not make this method virtual.
        // A derived class should not be able to override this method.
        public void Dispose()
        {
            Dispose(true);
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
        }

        // Dispose(bool disposing) executes in two distinct scenarios.
        // If disposing equals true, the method has been called directly
        // or indirectly by a user's code. Managed and unmanaged resources
        // can be disposed.
        // If disposing equals false, the method has been called by the
        // runtime from inside the finalizer and you should not reference
        // other objects. Only unmanaged resources can be disposed.
        private void Dispose(bool disposing)
        {
            // Check to see if Dispose has already been called.
            if(!this.disposed)
            {
                // If disposing equals true, dispose all managed
                // and unmanaged resources.
                if(disposing)
                {
                    // Dispose managed resources.
                    component.Dispose();
                }

                // Call the appropriate methods to clean up
                // unmanaged resources here.
                // If disposing is false,
                // only the following code is executed.
                CloseHandle(handle);
                handle = IntPtr.Zero;

                // Note disposing has been done.
                disposed = true;

            }
        }

        // Use interop to call the method necessary
        // to clean up the unmanaged resource.
        [System.Runtime.InteropServices.DllImport("Kernel32")]
        private extern static Boolean CloseHandle(IntPtr handle);

        // Use C# destructor syntax for finalization code.
        // This destructor will run only if the Dispose method
        // does not get called.
        // It gives your base class the opportunity to finalize.
        // Do not provide destructors in types derived from this class.
        ~MyResource()
        {
            // Do not re-create Dispose clean-up code here.
            // Calling Dispose(false) is optimal in terms of
            // readability and maintainability.
            Dispose(false);
        }
    }
    public static void Main()
    {
        // Insert code here to create
        // and use the MyResource object.
    }
}

Try This - Jack jack replied to theiry henry on 08-Dec-09 08:29 AM

public SQLHelper()
        {
            try
            {
                strConnectionString = Convert.ToString(ConfigurationManager.ConnectionStrings["SQLConnectionString"]);
                objSqlConnection = new SqlConnection(strConnectionString);
                objSqlCommand = new SqlCommand();
                objSqlCommand.CommandTimeout = intCommandTimeout;
                objSqlCommand.Connection = objSqlConnection;
            }
            catch (Exception objException)
            {
                throw new Exception("Error initializing data class." + Environment.NewLine + objException.Message);
            }
        }
       

       
        public void Dispose()
        {
            try
            {
                //Clean Up Connection Object
                if (objSqlConnection != null)
                {
                    if (objSqlConnection.State != ConnectionState.Closed)
                    {
                        objSqlConnection.Close();
                    }
                    objSqlConnection.Dispose();
                }

                //Clean Up Command Object
                if (objSqlCommand != null)
                {
                    objSqlCommand.Dispose();
                }

            }
            catch (Exception ex)
            {
                throw new Exception("Error disposing data class." + Environment.NewLine + ex.Message);
            }

        }