2012-03-30 68 views

回答

1

如果一个类实现了IDisposable,那么调用该类的构造函数的任何人都应确保生成的实例的方法将在该实例的最后一次使用和其放弃之间的某个时间被调用。通常情况下,一个类将实现IDisposable,如果在其生命周期的某个时间点,一个实例会要求其他实体(可能只是任何东西,甚至可能不在同一台计算机上!)开始代表它做某件事情,除非有其他指示,否则其他实体会这样做。方法将使实例指示所有这些实体,他们不再需要为其代表他们正在做的任何事情做任何事情。

为了在不首先调用IDisposable.Dispose()时允许(错误地)放弃对象,如果系统发现它们已被放弃,.net和Java允许对象请求通知。这种通知采用调用方式Finalize。请注意,无法保证对象放弃和调用Finalize()之间经过的时间。在某些情况下,如果不小心,系统可能会在对象正在忙于使用其他代表它的对象的服务时调用Finalize(从而导致其他对象在它们仍然处于停止状态时停止提供其服务需要)。由于C#标准的创建者并不喜欢人们编写代码的想法,因此需要框架在每个对象中包含可覆盖的Finalize方法,因此C#编译器不允许代码覆盖finalize。相反,出于被遗弃的对象可以并且应该是可移植的错误信念,他们需要使用类似于C++析构函数的语法编写一段代码。这样的块被称为析构函数,虽然它不像C++那样。相反,它会生成Finalize以及其他一些代码的覆盖。请注意,任何在.net中正确使用析构函数的代码都必须使用方法GC.SuppressFinalize()GC.KeepAlive(),因此要求使用析构函数序列而不是Object.Finalize()覆盖,并不会增强可移植性。