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

时间:2009-10-16 16:58:10

标签: c# .net design-patterns dispose

以下是来自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;   
    }
}

4 个答案:

答案 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调用并且适当地起作用。