在C#中处理调用Dispose(IsDisposing)模式的目的?

这是来自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文章的Subclass中详细介绍了子类化问题。

关于答案,

如果从终结器调用,则Dispose(disposing)方法不应显式释放资源,因为GC可以释放这些资源。

它缺少一个重要的词。 这应该说:

如果从终结器调用,则您的Dispose(disposing)方法不应显式释放可终结 (即托管)资源,因为这些资源可以由GC释放。 应该只在Finalizer中发布本机资源。

我很确定这张海报意味着这个,但在post中只是不够明确:)

如果从终结器调用,则Dispose(disposing)方法不应显式释放资源,因为GC可以释放这些资源。

因此,Dispose(disposing)应该检查它是手动调用还是从GC调用并且适当地起作用。