C#中析构函数、Dispose、Close方法的区别

2019-12-30 12:18:38王冬梅

        // 为了保持代码的可读性性和可维护性,千万不要在这里写释放非托管资源的代码   
        // 必须以Dispose(false)方式调用,以false告诉Dispose(bool disposing)函数是从垃圾回收器在调用Finalize时调用的   
        Dispose(false);
    }
    // 无法被客户直接调用   
    // 如果 disposing 是 true, 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放  
    // 如果 disposing 是 false, 那么函数是从垃圾回收器在调用Finalize时调用的,此时不应当引用其他托管对象所以,只能释放非托管资源   
    protected virtual void Dispose(bool disposing)
    {
        // 那么这个方法是被客户直接调用的,那么托管的,和非托管的资源都可以释放   
        if (disposing)
        {
            // 释放 托管资源   
            OtherManagedObject.Dispose();
        }
        //释放非托管资源   
        DoUnManagedObjectDispose();
        // 那么这个方法是被客户直接调用的,告诉垃圾回收器从Finalization队列中清除自己,从而阻止垃圾回收器调用Finalize方法.   
        if (disposing)
            GC.SuppressFinalize(this);
    }
    //可以被客户直接调用   
    public void Dispose()
    {
        //必须以Dispose(true)方式调用,以true告诉Dispose(bool disposing)函数是被客户直接调用的   
        Dispose(true);
    }
}

 

上面的范例达到的目的:

1/ 如果客户没有调用Dispose(),未能及时释放托管和非托管资源,那么在垃圾回收时,还有机会执行Finalize(),释放非托管资源,但是造成了非托管资源的未及时释放的空闲浪费

2/ 如果客户调用了Dispose(),就能及时释放了托管和非托管资源,那么该对象被垃圾回收时,不回执行Finalize(),提高了非托管资源的使用效率并提升了系统性能