C# 中 Dispose 调用 Dispose(IsDisusing) 模式的目的?

问题描述 投票:0回答:4

这里是来自 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;   
    }
}
c# .net design-patterns dispose
4个回答
17
投票

终结器将调用

Dispose(false)
- 在这种情况下,您不会触及任何其他托管资源(可能已经被终结)。

就我个人而言,我并不经常遵循这种模式 - 因为我很少需要终结器,而且我也很少编写非密封的

IDisposable
实现。如果您正在编写一个没有终结器的密封类,我会选择一个简单的实现。


3
投票

这是为了允许终结器工作属性,以及允许从您的类派生的子类正确处置。

如果您想要更详细的信息,我在 IDisposable 上写了一个 5 部分的博客系列,并在 IDisposable Class 文章中的子类中详细介绍了子类化问题。


1
投票

关于答案,

如果从终结器调用,您的 Dispose(处置)方法不应显式释放资源,因为这些资源可能已被 GC 释放。

漏掉了一个重要的词。这确实应该说:

如果从终结器调用,您的 Dispose(处置)方法不应显式释放 finalized(即托管)资源,因为这些资源可能已被 GC 释放。仅应在 Finalizer 中释放本机资源。

我很确定海报的意思是这个,但帖子中不够明确:)


0
投票

如果从终结器调用您的 Dispose(处置)方法,则不应显式释放资源,因为这些资源可能已被 GC 释放。

因此,Dispose(处置)应该检查它是手动调用还是从GC调用,并采取适当的行动。

© www.soinside.com 2019 - 2024. All rights reserved.