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

  • 相关阅读:
    高级语言发展之回归人类思维——听老赵的Session有感
    走进单元测试(1):为什么难以广泛应用?
    梦话对象之三:三要素的差异与统一
    走进单元测试(2):必须要自动化
    缺乏自信怎么办?
    梦话对象之一:逃不开的生死问题
    走进单元测试(3):消灭HttpContext的依赖,兼谈单元测试的设计辅助性
    我也想对广大程序员说一些话
    梦话对象之二:事件之无限扩展
    《JavaScript高级程序设计》学习笔记——错误处理与调试
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/6889360.html
Copyright © 2011-2022 走看看