System.Object.Finalize 方法
方法描述
允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。
语法定义
protected virtual void Finalize()
参数/返回值
参数值/返回值 | 参数类型/返回类型 | 参数描述/返回描述 |
---|---|---|
返回值 | void |
提示和注释
在当前对象销毁之前,该 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。
System.Object.Finalize 方法例子
此外请注意,C# 示例提供析构函数而不是重写 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
版本信息
.NET Framework 受以下版本支持:4、3.5、3.0、2.0、1.1、1.0 .NET Framework Client Profile 受以下版本支持:4、3.5 SP1 受以下版本支持:
适用平台
Windows 7, Windows Vista SP1 或更高版本, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008(不支持服务器核心), Windows Server 2008 R2(支持 SP1 或更高版本的服务器核心), Windows Server 2003 SP2 .NET Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。