3

(Windows API created objects, File, Database connection objects, COM objects, etc.) are outside the scope of .NET Framework. We have to explicitly clean our resources. For these types of objects, .NET Framework provides Object.Finalize method, which can be overridden and clean up code for unmanaged resources...

  1. Why is it preferred to not use finalize for clean up?

  2. What is appropriate to use?

4

1 回答 1

3

首选方式是IDisposabledispose 模式一起实现。终结器是有时间限制的,如果它阻塞太久,GC 将终止终结器——这是尽可能避免它的主要原因。

Dispose只是一个方法调用,没有时间限制。Disposedispose 模式可选地为调用者忘记调用(因为它没有被强制执行)作为释放资源的最后尝试的情况提供终结器。如果调用了 dispose,该模式还会抑制终结器。

我遇到的需要终结器的唯一有效用途是我为第三方应用程序编写的一系列加载项,这些加载项没有引发相关事件以正确管理对象生命周期。我使用终结器来确保我至少尝试过清理东西。除此之外,我从未直接依赖它。

IDisposable在 C# 中使用using关键字来满足。任何实现这个接口的东西都可以这样使用:

using (var myDisposableItem = new MyDisposableItem())
{
} // Dispose will be called here for you.

所以从调用的角度来看,这非常简单。

.NET Framework 中有多种类型可以实现IDisposable但没有可处理的内容。我总是建议他们表现得好像他们需要直接处置一样,因为公共合同规定他们有东西要处置,即使实施没有。不要对实现细节进行编程。

于 2013-10-03T08:17:24.930 回答