zoukankan      html  css  js  c++  java
  • 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,这样析构函数不会被调用。

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

    伪python爱好者,正宗测试实践者。
  • 相关阅读:
    C#线程同步(1)- 临界区&Lock
    详细解析Java中抽象类和接口的区别
    防止重复提交的几种办法
    网页中实现JSON的编辑与显示
    xcode5 ios7升级后的一系列问题解决
    hadoop-2.0.0-mr1-cdh4.2.0源码编译总结
    hadoop-2.0.0-cdh4.2.1源码编译总结
    cocos2d-iphone加入芒果广告
    hadoop2.0 eclipse 源码编译
    HBase学习笔记
  • 原文地址:https://www.cnblogs.com/herbert/p/1750926.html
Copyright © 2011-2022 走看看