.NET Tip: Implement IDisposable to Ensure Your Objects Clean Up After Themselves

public class GoodResourceCitizen : IDisposable

{

    private bool _IsDisposed = false;

    ~GoodResourceCitizen()

    {

        Dispose(false);

    }

    public void Dispose()

    {

        Dispose(true);

        // Tell the garbage collector not to call the finalizer

        // since all the cleanup will already be done.

        GC.SuppressFinalize(true);

    }

    protected virtual void Dispose(bool IsDisposing)

    {

        if (_IsDisposed)

          return;

       if (IsDisposing)

       {

           // Free any managed resources in this section

       }

       // Free any unmanaged resources in this section

       _IsDisposed = true;

    }

}

 

 

 public class Person:IDisposable

    {

        public int Age { get; set; }



        public override string ToString()

        {



            return base.ToString();

        }

        public Person ShallowClone()

        {



            return base.MemberwiseClone() as Person;

        }



        public Person DeepClone()

        {

            var p = new Person();

            p.Age = this.Age;

            p.Address = new Address() { Detail = this.Address.Detail };

            return p;



        }

        /// <summary>

        /// 析构函数

        /// 自动调用基类的Finalize()释放非托管资源

        /// </summary>

        ~Person()

        {

            //会自动调用base.Finalize();用来释放非托管资源

            Dispose(false);

        }





        public Address Address { get; set; }



        public void Dispose()

        {

            Dispose(true);

            //在上面的Dispose(true)已经释放了非托管资源,所以GC就不能在调用Finalize()方法了,所以需要废除当前对象的Finalize()

            GC.SuppressFinalize(this);

        }

        /// <summary>

        /// 

        /// </summary>

        /// <param name="disposing">是否Dispose方法调用自己</param>

        protected virtual void Dispose(bool disposing)

        {

            if (disposing)

            {

                //release managed resources

            }

            //release unmanaged resources

        }

        

    }



using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



namespace ConsoleApplication1

{

    public class Human:IDisposable

    {

        ~Human()

        {

            Dispose(false);

     

        }



        public void Dispose()

        {

            Dispose(true);

            GC.SuppressFinalize(this);

        }

        protected virtual void Dispose(bool disposing)

        {

            if (disposing)

            {

                //release managed resources

            }



            //release unmanaged resources



        }

    }



    public class Animal 

    {

        ~Animal()

        {

            Dispose(false);



        }



        public void IDisposable.Dispose()

        {

            Dispose(true);

            GC.SuppressFinalize(this);

        }

        protected virtual void Dispose(bool disposing)

        {

            if (disposing)

            {

                //release managed resources

            }



            //release unmanaged resources



        }

        public void Close()

        {

            Dispose(false);

        }

    }



    public class demo

    {

        public void haha()

        {

            var human = new Human();

            human.Dispose();



            var animal = new Animal();

            animal.Close();



            (animal as IDisposable).Dispose();

        }

    }

}

 

参考文献

1.C#中Finalize方法的问题

2.Object.Finalize 方法

3.C#中Finalize方法的问题

4.C#中对象的销毁有三种方式Finalize,Dispose,GC。

5.《Effective C#》读书笔记——了解.NET内存管理机制<.NET资源管理>

你可能感兴趣的:(object)