欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 »  .NET本质论第一卷:公共语言运行库教程 » 正文

本教程章节列表

程序的终结-Finalize方法与IDisposable接口

创建时间:2012年12月03日 23:32  阅读次数:(5447)
分享到:

程序的终结


一般来说,你不需要知道对象何时被回收。对象引用的所有下一级对象本身也将作为GC操作的一部分被自动回收。对于触发清理代码的执行,推荐机制是使用一个终结处理程序。终结处理程序(termination handler)保护方法内一定范围的指令,它保证在离开受保护范围指令之前,执行这个“处理程序( handler)”,该机制是通过在第6章中讨论的try-finally构件向c#程序员公开的。

尽管存在着终结程序的机制,但习惯于使用c++的程序员还是旧习难改,总是想在对象的生存期中清理代码。为了降低他们的学习难度,CLR支持一种称为对象终结(object finalization)的机制。然而,对象终结是异步发生的,它与许多c++背景的程序员(包括作者本人),所使用的c++风格的析构函数(destructor)根本不同。当然,针对CLR的新设计应该避免过多地使用终结程序,因为它既复杂,又会产生性能损失。

对于那些在被返回到堆时想要得到通知的对象  可以重写Object.Finalize方法。当GC试图回收一个带有终结程序的对象时,回收行为将会被推迟,直到终结程序被调用。GC将需要终结的对象排列在终结队列中,而不是回收它的内存。一个专门的GC线程最后会调用对象终结程序,并且,在终结程序完成执行后,对象的内存对于回收就是有效的。这意味着带终结程序的对象在被回收前,占用了至少两次单独的垃圾回收过程。

你的对象能够执行任何特定应用的逻辑来响应这个通知。不过,CLR可能会在确定你的对象是不可到达之后的很长一段时间,才调用Object.Finalize方法,并且这个方法将在CLR的某个内部线程上执行。从垃圾回收器确定你的对象是不可到达的,到对象终结程序被调用,可能会间隔很长的一段时间。因此,假如你想通过终结程序释放稀有资源,那么在很多情况下都无法容忍这个间隔时间,这也限制了终结程序的实用性。

重写默认Finalize方法的类需要调用该方法的基类型版本,以确保没有忽略基类型的功能性。在C#中,你不能直接实现Finalize方法。准确地说,你必须实现一个析构函数( destructor),这将导致编译器在Finallze方法内发射你的析构函数代码,接着调用你的基类型的Finalize方法。示例5.19显示了一个包含析构函数的简单的C#类。注释部分说明了编译器生成的(compiler-generated) Finalize方法。



因为GC是异步执行的,所以,依靠终结程序清理稀有资源并不是个好  主意,为此,在CLR编程中有一个标准的习惯用法,就是提供一个显式的Dispose方法,以便客户端在使用完你的对象后进行调用。实际上,System.IDisposable接口标准化了该惯用语法。下面是Systtem.IDisposable的定义:
Namespace System
{
Public interface IDisposable{
Void Dispose();
}
}
<
来源:.net学习网
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf】

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 50+79=? 的结果(结果是:129)
结  果: