zoukankan      html  css  js  c++  java
  • IDisposeable,Close

    一.资源分类

         资源分为托管资源和非托管资源。

             非托管资源:所有的windows内核对象(句柄)都是非托管资源,如stream,数据库连接,GDI+和COM对象等,这些资源不受CLR管理。

             托管资源:由CLR管理的资源。

         释放

             非托管资源:需要显式释放。

             托管资源:系统释放。

    二.释放方式

         1.实现IDisposeable接口的Dispose()方法

         2.采用析构函数

         3.Close(),其实跟第一种一样

    三.Dispose(),Close()区别

         资源释放的一个正确的措施是实现IDisposeable接口Dispose()方法。需要释放资源时,显式调用Dispose()方法即可。

         C#还有一个语法糖,使用Using块,在离开using块的时候,CLR会自动调用所创建对象的Dispose()方法。

         Close():           

    public void Cloase()
    {
        //.....
        ((IDisposeable)this).Dispose();
    
    }
    

      Dispose(): 

    void IDisposeable.Dispose()
    {
        this.Dispose(true);
    GC.SuppressFinalize(this); }

       从上面代码来看,Close()方法最终还是使用的Dispose()方法,

    之所以这么做,是因为这些类型出于显式实现IDisposable的因素,在调用这些Dispose方法的时候,必须完成一次转型,如: 

               ((IDisposable)new A()).Dispose(); 

    为了避免转型,同时也为了避免不熟悉C#语法的开发人员更直观的释放资源,提供了Close方法。

               GC.SuppressFinalize(this);

           这是告诉CLR,在进行垃圾回收的时候,不用再继续调用析构函数了。也验证了析构函数只是作为资源释放的一种补救措施,真正有效的还是Dispose()。

           下面是合理的释放模式函数:

                  

    class ShouldDispose:IDisposeable
    {
        public void Dispose()
        {
             this.Dispose(true);
             DC.SuppressFinalize(this);
         }
    
         protected virtual void Dispose(bool disposing)
         {
               if(disposing)
              {...}
    
          }
          
          ~ShouldDispose(){...} //没有返回类型,没有参数,没有修饰符
    
    }
    
    class test:ShouldDispose
    {
        protected virtual void Dispose(bool disposing)
        {
               if(disposing) 
               { 
                      //执行子类清理代码
                }
                else
                {
                       //如果有必要,执行base.Dispose(disposing)
                 }
         }
         
         public void Close()
         {
                 //调用本类或基类的Dispose方法
          }
    }
    

      

         本文章内容来自CSDN:http://blog.csdn.net/luminji/article/details/16984497

  • 相关阅读:
    计算panel的靶向区段长度
    interval的排序,合并,取样等功能
    Bait 和 target的区别
    R 数据拆分到列
    制作annovar注释依赖的cosmic数据库
    制作适用于annovar的COSMIC数据库
    痘痘机理
    属性、域、元组、关系、候选码、主键、外键、关系代数
    how to install emacs25 in ubuntu 14
    Centos Install Emacs
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/6889360.html
Copyright © 2011-2022 走看看