以下是来自MSDN的代码。我不明白为什么这里的工作不只是在常规的Dispose()方法中完成。使用Dispose(bool)方法的目的是什么?谁会在这里打电话给Dispose(假)?
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;
}
}
答案 0 :(得分:14)
终结器会调用Dispose(false)
- 在这种情况下,您不会触及任何其他托管资源(可能已经完成)。
就我个人而言,我并不经常遵循这种模式 - 因为我只非常非常需要终结器,而且我也很少编写非密封的IDisposable
实现。如果你正在写一个没有终结器的密封课程,我会选择一个简单的实现。
答案 1 :(得分:3)
这是为了允许终结器工作属性,以及允许从您的类派生的子类正确处置。
如果您需要更详细的信息,我写了5 part blog series on IDisposable,并在Subclass from an IDisposable Class article中详细介绍了子类问题。
答案 2 :(得分:1)
关于答案,
如果从终结器调用,则您的Dispose(disposing)方法不应显式释放资源,因为GC已经释放了这些资源。
它缺少一个重要的词。这应该说:
如果从终结器调用,则您的Dispose(disposing)方法不应显式释放可终结(即托管)资源,因为GC可以释放这些资源。只应在Finalizer中发布本机资源。
我很确定这张海报意味着这个,但在帖子中只是不够明确:)
答案 3 :(得分:0)
如果从终结器调用,则Dispose(disposing)方法不应显式释放资源,因为GC已经释放了这些资源。
因此,Dispose(disposing)应该检查它是手动调用还是从GC调用并且适当地起作用。