这里是来自 MSDN 的代码。我不明白为什么这项工作不只是在常规 Dispose() 方法中完成。使用 Dispose(bool) 方法的目的是什么?谁会在这里调用 Dispose(false) ?
public void Dispose()
{
Dispose(true);
// Use SupressFinalize in case a subclass
// of this type implements a finalizer.
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
// If you need thread safety, use a lock around these
// operations, as well as in your methods that use the resource.
if (!_disposed)
{
if (disposing) {
if (_resource != null)
_resource.Dispose();
Console.WriteLine("Object disposed.");
}
// Indicate that the instance has been disposed.
_resource = null;
_disposed = true;
}
}
终结器将调用
Dispose(false)
- 在这种情况下,您不会触及任何其他托管资源(可能已经被终结)。
就我个人而言,我并不经常遵循这种模式 - 因为我很少需要终结器,而且我也很少编写非密封的
IDisposable
实现。如果您正在编写一个没有终结器的密封类,我会选择一个简单的实现。
这是为了允许终结器工作属性,以及允许从您的类派生的子类正确处置。
如果您想要更详细的信息,我在 IDisposable 上写了一个 5 部分的博客系列,并在 IDisposable Class 文章中的子类中详细介绍了子类化问题。
关于答案,
如果从终结器调用,您的 Dispose(处置)方法不应显式释放资源,因为这些资源可能已被 GC 释放。
漏掉了一个重要的词。这确实应该说:
如果从终结器调用,您的 Dispose(处置)方法不应显式释放 finalized(即托管)资源,因为这些资源可能已被 GC 释放。仅应在 Finalizer 中释放本机资源。
我很确定海报的意思是这个,但帖子中不够明确:)
如果从终结器调用您的 Dispose(处置)方法,则不应显式释放资源,因为这些资源可能已被 GC 释放。
因此,Dispose(处置)应该检查它是手动调用还是从GC调用,并采取适当的行动。