文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>C#资源释放及Dispose、Close和析构方法

C#资源释放及Dispose、Close和析构方法

时间:2011-01-05  来源:luminji

 

在开始本文前,需要一些准备知识。首先要提出“什么是资源”。在CLR出来之后,Windows系统资源开始分为“非托管资源”和“托管资源”。

         非托管资源是指:所有的Window内核对象(句柄)都是非托管资源,如对于Stream,数据库连接,GDI+的相关对象,还有Com对象等等,这些资源并不是受到CLR管理;

         托管资源是指:由CLR管理分配和释放的资源,即由CLR里new出来的对象。

 

其次再来讲,资源的释放方式。

         非托管资源:需要显式释放的,也即需要你写代码释放;

         托管资源:分为值类型资源和引用类型资源。值类型是在栈上分配的,由CLR自动回收。引用类型是在堆上分配的,需要写代码显式释放(备注:如果类型含有非托管资源,则需要显示释放。否则,如果不再使用类型之对象,可在外部给对象置为null,并不需要为类型实现IDispose)。

        

显式释放的C#实现,由C#语法支持的有:

         1:实现IDisposable接口的Dispose方法;

         2:析构方法(终结器);

         不由C#语法支持,但是约定支持的显式释放是:

         3:提供Close方法;

 

但是,还需要区分这3种方式的异同点。首先,你无法调用析构方法。析构方法是由垃圾回收机制进行调用的。换句话来说,就是你不知道析构方法被调用的时机。严格意义上来说,它只是作为资源释放的一个补救措施。

资源释放的一个正确的措施是为类型实现IDisposable接口的Dispose。当你需要释放类型的资源的时候,应该显示的调用Dipose方法。当然,这里还有一个C#的语法糖,就是使用using程序块,在离开using程序块的时候,CLR会自动调用类型所创建对象的Dipose方法。

可能有人会问道,既然可以通过Dispose方法的方式来进行资源的释放,为什么有些类型还需要提供一个Close方法。这里面的区别,或者说约定在于,如果你仔细观察这些类型:他们基本都只公开了Close方法,他们都实现了IDisposable,但都隐藏了Dispose方法。以Socket这个类为例,它:

1:提供public void Close()

    public void Close()

{

….

((IDisposable)
this).Dispose();

….

}

2:提供显式void IDisposable.Dispose()

    void IDisposable.Dispose()

{

this.Dispose(true);

GC.SuppressFinalize(
this);

}

3:提供protected virtual void Dispose(bool disposing)。真正的资源释放的代码放在这里。

 

所以理论上来将,提供Close方法最终还是使用的Dispose方法,之所以这么做,是因为这些类型出于显式实现IDisposable的因素,在调用这些Dispose方法的时候,必须完成一次转型,如: 

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

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

在上文的例子中,你可能已经注意到IDisposable.Dispose这个方法中,包含一句: 

      GC.SuppressFinalize(this); 

这是告诉CLR,在进行垃圾回收的时候,不用再继续调用析构方法(终结器)了。是的,因为你已经手动释放资源了。这也从另一个方面验证了析构方法只是作为资源释放的补救机制。因为假设你忘记Close或者Dispose了,CLR会在垃圾回收的时候为你做这件事。查看Socket的析构函数,你会很好的理解这一点。

    ~Socket()

{

this.Dispose(false);

}

是的,析构方法调用的也是Dispose。

 

备注:跟帖中有人提到“完全托管的引用类型,应该不需要显示释放吧。比如自定义的类型子,似乎也没有办法显示释放吧”。应当说,恰恰相反,即使不实现IDisposable的类型,如果不再使用,也应该显式释放(即置为null),以确保进行垃圾回收。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载