IDisposable接口和析构函数的联合使用

正确调用Dispose(),同时把执行析构函数作为一种安全机制,以防没有调用Dispose().

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;



namespace MemRelease

{

    public class ResourceHolder : IDisposable

    {

        private bool isDisposed = false;



        public void Dispose()

        {

            Dispose(true);

            GC.SuppressFinalize(this);

        }



        protected virtual void Dispose(bool disposing)

        {

            if (!isDisposed)

            {

                if (disposing)

                {

                    // Cleanup managed object by calling their Dispose() method

                }



                // Cleanup unmanaged objects

            }

            isDisposed = true;

        }



        ~ResourceHolder()

        {

            Dispose(false);

        }



        public void SomeMethod()

        {

            // Ensure object not already disposed before execution of any method

            if (isDisposed)

            {

                throw new ObjectDisposedException("ResourceHolder");

            }



            // Method implementation

        }

    }



    class Program 

    {        

        static void Main(string[] args)

        {

            

        }

    }

}

这段代码里面,Dispose()有第二个proteced重载方法,它带有一个bool参数,这是真正完成清理工作的方法。

最后IDisposable.Dispose()包含一个对System.GC.SuppressFinalize()方法的调用。GC表示垃圾收集器,SuppressFinalize()方法则告诉垃圾收集器有一个类不再需要调用其析构函数。因为Dispose已经完成了所有需要的清理工作,所以析构函数不在需要做任何工作。

 

书上的说法:

 

传递给Dispose(bool)的参数表示Dispose(bool)是有析构函数调用,还是有IDisposable.Dispose()调用 ---- Dispose(bool)不应从代码的其他地方调用,其原因是

  • 如果客户调用IDisposable.Dispose(),该客户就指定应清理所有与该对象相关的资源,包括托管和非托管。
  • 如果调用了析构函数,原则上所有的资源仍需要清理。

【我的看法】

从这个程序上看,实际上是这样的

当用户调用ResourceHolder类的Dispose()方法的时候,运行Dispose(true),释放的是托管对象的资源,然后释放未托管对象资源,最后将isDisposed设置为true,这样析构函数不会被调用。

 

郁闷呢,这里的析构函数岂不是摆样子了,析构函数起什么作用呢?!

你可能感兴趣的:(OS)