假设这是传统的 Dispose 模式(取自 devx 但在许多网站上都能看到)
class Test : IDisposable
{
private bool isDisposed = false;
~Test()
{
Dispose(false);
}
protected void Dispose(bool disposing)
{
if (disposing)
{
// Code to dispose the managed resources of the class
}
// Code to dispose the un-managed resources of the class
isDisposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
我不明白为什么我们调用 GC.SupressFinalize(this)
。这需要我编写自己的托管资源处置,包括清空我的引用?我有点失落,我必须承认。有人可以阐明这种模式吗?
理想情况下,我只想处理我的非托管资源,让 GC 自己进行托管收集。
其实,我什至不知道为什么要指定终结器。无论如何,编码器应该自己调用 dispose,现在不是吗?如果这只是一种后备机制,我会删除它。
最佳答案
使用 IDisposable
模式,以便在客户端代码调用 Dispose
方法时,对象可以确定性地清理其资源。
如果客户端代码由于某种原因无法调用 Dispose
,终结器仅作为备用。
如果客户端代码调用 Dispose
,那么资源清理会立即执行,并且不需要在完成期间再次完成。在这种情况下调用 SuppressFinalize
意味着该对象不再产生额外的 GC 终结成本。
而且,如果您自己的类仅使用托管 资源,则完全不需要终结器:GC 将处理所有托管资源,让这些资源自己担心是否它们 需要一个后备终结器。如果它直接处理非托管资源,您应该只考虑在您自己的类中使用终结器。
关于c# - 为什么传统的 Dispose 模式会抑制 finalize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4485839/