(Windows API创建的对象,文件,数据库连接对象,COM对象等)超出了.NET Framework的范围。我们必须明确清理我们的资源。对于这些类型的对象,.NET Framework提供了 Object.Finalize 方法,该方法可以被覆盖并清理非托管资源的代码......
为什么不使用finalize进行清理?
什么是合适的?
答案 0 :(得分:3)
首选方法是与dispose pattern一起实施IDisposable
。终结器是有时间限制的,如果终结器阻塞太久,GC将终止终结器 - 这是在可能的情况下避免它的主要原因。
Dispose
只是一个方法调用,没有时间限制。对于那些调用者忘记调用Dispose
(因为它没有强制执行)作为最后尝试释放资源的情况,dispose模式可选地具有终结器。如果调用dispose,该模式也会抑制终结器。
我遇到需要终结器的唯一有效用途是我为第三方应用程序编写的一系列加载项,这些加载项没有为正确管理对象生命周期而引发相关事件。我用终结器来确保我至少试图清理东西。除此之外,我从未直接依赖它。
使用IDisposable
关键字在C#中提供 using
。因此可以使用任何实现此接口的内容:
using (var myDisposableItem = new MyDisposableItem())
{
} // Dispose will be called here for you.
所以从调用的角度来看,这很简单。
.NET Framework中有各种类型实现IDisposable
但没有任何可处理的类型。我总是建议他们表现得好像他们需要直接处理,因为公共合同规定他们有处理的东西,即使实施没有。不要编程实现细节。