C#高级编程中在介绍dispose有这么一个例子:    public class DataStoreConnection:IDisposable
    {
        private int DataStoreHandle = 0;
        private bool CanOpen = true;
        private readonly string name;
        public DataStoreConnection(string name)
        {
            this.name = name;
        }
        public void Open()
        {
            if (CanOpen == false)
            {
                Console.WriteLine(name + "Error:Attenpt open after calling dispose!");
            }
            else
            {
                if (DataStoreHandle == 0)
                {
                    DataStoreHandle = 1;
                    Console.WriteLine(name + ":connected");
                }
                else
                {
                    Console.WriteLine(name + "Error:already open");
                }
            }
        }
        public void Close()
        {
            DataStoreHandle = 0;
        }        public void Dispose()
        {
            Console.WriteLine("Disposing:" + name);
            CanOpen = false;
            Close();
            GC.SuppressFinalize(this);
        }        ~DataStoreConnection()
        {
            Close();
        }
        
    }这里的dispose函数中GC.SuppressFinalize(this);这个语句书上说表示让GC不要去回收了,那在调用完dispose后,程序不会删除对象了啊,还有为什么还要添加~DataStoreConnection()。本人用C++的,实在不明白继承idisposabel接口的类怎么删除对象

解决方案 »

  1.   

    这是因为,Dispose()函数是被其它代码显式调用并要求释放资源的,而Finalize是被GC调用的。在GC调用的时候DataStoreConnection所引用的其它托管对象可能还不需要被销毁,并且即使要销毁,也会由GC来调用。因此在Finalize中只需要释放非托管资源即可。另外一方面,由于在Dispose()中已经释放了托管和非托管的资源,因此在对象被GC回收时再次调用Finalize是没有必要的,所以在Dispose()中调用GC.SuppressFinalize(this)避免重复调用Finalize。
      

  2.   

    ~DataStoreConnection(),这样是为了防止万一啊,如果用户没有调用Dispose()
    ,按照C++的说法就是要内存泄露了。所以定义西够函数,就是要防止这样的万一。
    托管的对象不必用户去删除,GC要去回收,除非这个GC.SuppressFinalize(this)被调用,再说了C#也没有DELETE这样的语句,要用到DISPOSE()的地方是为了使用非托管资源用的
      

  3.   

    ~DataStoreConnection(),这样是为了防止万一啊,如果用户没有调用Dispose()
    ,按照C++的说法就是要内存泄露了。所以定义西够函数,就是要防止这样的万一。
    托管的对象不必用户去删除,GC要去回收,除非这个GC.SuppressFinalize(this)被调用,再说了C#也没有DELETE这样的语句,要用到DISPOSE()的地方是为了使用非托管资源用的