注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

Object.Finalize 方法  

2012-01-02 23:01:53|  分类: C# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
protected virtual void Finalize()  

在当前对象销毁之前,该 Finalize 方法用于执行当前对象占用的非托管资源上的清理操作。 方法是受保护的,因此只能通过此类或派生类访问它。

对象变为不可访问后将自动调用此方法,除非已通过 GC.SuppressFinalize 调用使对象免除了终结。 在应用程序域的关闭期间,Finalize 将自动在没有免于终止的对象,甚至是那些仍可以访问的对象上调用。 对于给定的实例仅自动调用 Finalize 一次,除非使用 GC.ReRegisterForFinalize 这类机制重新注册该对象并且后面没有调用 GC.SuppressFinalize

派生类型中的每个 Finalize 实现都必须调用其基类型的 Finalize 实现。 这是唯一一种允许应用程序代码调用 Finalize 的情况。


注意 注意

因为 C# 编译器不允许直接执行 Finalize 方法,所以 C# 析构函数将自动调用基类的析构函数。


Finalize 操作具有下列限制:


垃圾回收过程中执行终结器的准确时间是不确定的。 不保证资源在任何特定的时间都能释放,除非调用 Close 方法或 Dispose 方法。


即使一个对象引用另一个对象,也不能保证两个对象的终结器以任何特定的顺序运行。 即,如果对象 A 具有对对象 B 的引用,并且两者都有终结器,则当对象 A 的终结器启动时,对象 B 可能已经终结了。


运行终结器的线程是未指定的。


在下面的异常情况下,Finalize 方法可能不会运行完成或可能根本不运行:


另一个终结器无限期地阻止(进入无限循环,尝试获取永远无法获取的锁,诸如此类)。 由于运行时尝试运行终结器来完成,所以如果一个终结器无限期地阻止,则可能不会调用其他终结器。


进程终止,但不给运行时提供清理的机会。 在这种情况下,运行时的第一个进程终止通知是 DLL_PROCESS_DETACH 通知。


在关闭过程中,只有当可终结对象的数目继续减少时,运行时才继续 Finalize 对象。

如果 Finalize 或 Finalize 的重写引发异常,并且运行时并非寄宿在重写默认策略的应用程序中,则运行时将终止进程,并且不执行任何活动的 try-finally 块或终结器。 如果终结器无法释放或销毁资源,此行为可以确保进程完整性。

对实现者的说明

默认情况下,Object.Finalize 不执行任何操作。 只有在必要时才必须由派生类重写它,因为如果必须运行 Finalize 操作,垃圾回收过程中的回收往往需要长得多的时间。

如果 Object 保存了对任何资源的引用,则 Finalize 必须由派生类重写,以便在垃圾回收过程中,在放弃 Object 之前释放这些资源。

当类型使用文件句柄或数据库连接这类在回收使用托管对象时必须释放的非托管资源时,该类型必须实现 Finalize。 有关辅助和具有更多控制的资源处置方式,请参见 IDisposable 接口。

Finalize 可以采取任何操作,包括在垃圾回收过程中清理了对象后使对象复活(即,使对象再次可访问)。 但是,对象只能复活一次;在垃圾回收过程中,不能对复活对象调用 Finalize。

析构函数是执行清理操作的 C# 机制。 析构函数提供了适当的保护措施,如自动调用基类型的析构函数。 在 C# 代码中,不能调用或重写 Object.Finalize。


using System; using System.Diagnostics; public class ExampleClass { Stopwatch sw; public ExampleClass() { sw = Stopwatch.StartNew(); Console.WriteLine("Instantiated object"); } public void ShowDuration() { Console.WriteLine("This instance of {0} has been in existence for {1}", this, sw.Elapsed); } ~ExampleClass() { Console.WriteLine("Finalizing object"); sw.Stop(); Console.WriteLine("This instance of {0} has been in existence for {1}", this, sw.Elapsed); } } public class Demo { public static void Main() { ExampleClass ex = new ExampleClass(); ex.ShowDuration(); } } // The example displays output like the following: // Instantiated object // This instance of ExampleClass has been in existence for 00:00:00.0011060 // Finalizing object // This instance of ExampleClass has been in existence for 00:00:00.0036294
  评论这张
 
阅读(586)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017