在.Net中处理和析构

时间:2012-03-30 09:50:57

标签: dispose

任何人都可以清楚地解释.Net中的Dispose,Destructor和Finalize之间的区别吗? 什么时候使用它们?

1 个答案:

答案 0 :(得分:1)

如果一个类实现了IDisposable,那么任何调用该类的构造函数的人都应该确保在该实例的最后一次使用和放弃之间的某个时间调用生成的实例的IDisposable.Dispose()方法。通常,如果一个实例在其生命周期的某个时刻要求某个其他实体(可能只是任何东西,甚至可能不在同一台计算机上!)开始做某事,那么一个类将实现IDisposable代表它,另一个实体将在其他情况下执行此操作。 IDisposable.Dispose()方法将导致实例指示所有此类实体,他们不再需要为此而执行任何操作。

为了允许在没有先调用IDisposable.Dispose()的情况下(错误地)放弃对象的可能性,.net和Java允许对象在系统发现它们已被放弃时请求通知。此类通知采用调用Finalize方法的形式。请注意,无法保证对象的放弃与对Finalize()的调用之间经过了多长时间。在某些情况下,如果一个人不小心,系统可能会在对象忙于使用代表它的某个其他对象的服务时调用Finalize(从而导致另一个对象停止提供其服务)虽然他们仍然需要)。

因为C#标准的创建者不喜欢编写需要框架在每个对象中包含可覆盖的Finalize方法的代码的想法,所以C#编译器不允许代码覆盖最终化。相反,出于明显错误的信念,被抛弃的对象可以而且应该是可移植的,他们需要使用类似于C ++析构函数的语法编写代码块。这样的块称为析构函数,尽管它的行为与C ++类似。相反,它会为Finalize生成一个覆盖以及其他一些代码。请注意,在.net中正确使用析构函数的任何代码都必须使用方法GC.SuppressFinalize()GC.KeepAlive(),因此要求使用析构函数序列而不是Object.Finalize()覆盖不会增强可移植性。