• 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

  • 相关阅读:
    SpringBoot相知
    SpringBoot初识
    Mybatis 3 配置 Log4j
    IdeaVim-常用操作
    [ZZ] 基于Matlab的标记分水岭分割算法
    [综] meanshift算法
    [ZZ] 麻省理工( MIT)大神解说数学体系
    [ZZ] UIUC同学Jia-Bin Huang收集的计算机视觉代码合集
    公务员 素养
    [zz]有哪些优秀的科学网站和科研软件推荐给研究生?
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/6889360.html
Copyright © 2020-2023  润新知