C#中dispose的标准模式是写两个dispose方法,一个是公有的不带参数的dispose()方法,一个是私有的带布尔参数的dispose(bool disposing)方法.一个例子如下:
    public class DisposeTest:IDisposable
    {
        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }        private void Dispose(bool disposing)
        {
            if(!disposed)
            {
                if(disposing)
                {
                   // 释放托管资源
                }
      
                // 释放非托管资源
            }
            disposed = true;         
        }
        ~DisposeTest()      
        {
            Dispose(false);
        }    }我的疑问在于Dispose(true)和Dispose(false)的区别上。我查阅过很多资料,所有的资料上都如下所述“当用户显示调用Dispose()方法时,要清理托管资源和非托管资源,并且调用GC.SuppressFinalize方法阻止垃圾收集器再次调用Finalise方法;当用户没有调用Dispose()方法,而是由垃圾收集器调用Finalize方法时,应该只释放非托管资源,因为假若在Finalize方法中引用另一个托管对象时,我们无法确定此时该托管对象的状态如何(是否已被回收)。”我非常不明白的是为什么Finalize方法中不能含有托管类型的引用,按照他们说的,“无法确定此时该托管对象的状态如何”,那么对于其他方法而言,它们里面为什么可以含有其他托管类型的引用,求大侠不吝赐教!!!!

解决方案 »

  1.   

    谁跟你说过“Finalize方法中不能含有托管类型的引用”?所谓区分Dispose(true)和Dispose(false),是因为有些托管程序要提前处理。例如SqlConnection需要及时释放,才能不让连接池溢出。而当GC执行清理时,已经无所谓了,所以根本用不着调用disposing==true的情况下的代码。disposing==true这个条件里边的代码,就是用于写那些等不及GC启动它的Finally了的代码,必须提前执行,所以Finally中自然没有必要执行它!就是这么简单的概念。