zoukankan      html  css  js  c++  java
  • 内存回收,Dispose,Close,Finalie(C#中的析构函数)

    NET中的资源分托管和非托管,所谓的托管是指CLR(通用语言运行时)中进行管理的资源,它可以由CLR自动进行内存回收. 也就是大家熟知的GC(垃圾回收机制). 而对于 非托管资源,比如数据库连接,COM连接等,那么需要手动清理回收资源. 清理非托管资源,我们可以用析构函数来执行,虽然它的执行时机不确定,但终究会被执行. 当然还有Dispose()和Close()方法,两者的区别在于,Close()后还要以用Open()打开,而Dispose()则是彻底销毁.
    --- 使用析构函数时,需要GC.Collect()才会执行到(GC,Collect()在自动回收机制中会自动执行,也可以显式调用它) 而Dispose()需要显式地调用,或者使用using() ,但是,需要注意:在用析构函数时,至少分两步走:调用函数,回收内存. 那么,在用using()或*.Dispose()后,GC还会再去执行析构函数. 因此,在Dispose()里,加上GC.SupressFinalize(this)来防止再次调用析构函数.
    总结: Dispose()和Close()需要显示调用,Dispose()可以通过using()调用.析构函数无法显式调用. Dispose()和析构函数是销毁对象,而Close()是关闭,可以通过Open()再开. 析构函数调用时机不确定,而Dispose()在显式或Using()时执行,Close()在显式时执行. 三者都是用来销毁非托管对象. 一段经典的C#-Dispose:

     1内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客private bool _isDisposed=false;  2内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客~MyTest()  3内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客{  4内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //this.Close();  5内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            Dispose(false);  6内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        }  7内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        /**//// <summary>  8内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        /// 内存释放,需要此类实例显式调用,如sql.Dispose();或Using()  9内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        /// </summary> 10内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        public void Dispose() 11内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客{ 12内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //IDisposable dispose = this as IDisposable; 13内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //if(dispose!=null) 14内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //{ 15内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //    dispose.Dispose(); 16内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            //} 17内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            Dispose(true); 18内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            GC.SuppressFinalize(this); 19内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        } 20内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        protected virtual void Dispose(bool disposing) 21内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客{ 22内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            if(!_isDisposed) 23内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客{ 24内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客                if(disposing) 25内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客                内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客{ 26内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客               //托管资源的释放     27内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客                } 28内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客               //非托管资源的释放 29内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客                _isDisposed = true; 30内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客            } 31内存回收,Dispose,Close,Finalie(C中的析构函数)  - zxianf - apple的博客        }
  • 相关阅读:
    【GPS】Android O平台如何设置SUPL地址,以及GPS三个配置文件的优先级分析
    【GPS】gps.conf文件解读
    【GPS】SAP测试GPS模块拿不到sensor数据
    Linux系统安装Samba共享服务器详解及安装配置
    CentOS 6.5 编译安装 LNMP环境
    linux禁止root用户直接登录
    Linux下安装配置日志服务器
    Windows系统安装Oracle 11g客户端
    Linux系统zabbix_agentd客户端安装与配置
    Redhat6.5——解决yum功能不能正常使用
  • 原文地址:https://www.cnblogs.com/pengzhihua/p/3995403.html
Copyright © 2011-2022 走看看