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

原文地址:https://www.cnblogs.com/xiaowangzi1987/p/6889360.html