处置标志在Dispose(bool)中到底意味着什么?

时间:2018-02-19 15:12:39

标签: c# design-patterns idisposable

如下面的示例实现,即https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose,有一个指示冗余呼叫的标志。在示例中,它始终位于Dispose(bool disposing)方法的最后一行。这是否意味着它表明所有内容都已被处理或只是简单地保护方法执行一次运行?

private bool disposed = false; // To detect redundant calls

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            if (this.cache != null)
            {
                this.cache.Dispose();
            }
        }

        disposed = true;
    }
}

该实施是否仍然正确?

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        disposed = true; 

        if (disposing)
        {
            if (this.cache != null)
            {
                this.cache.Dispose();
            }
        }            
    }
}

1 个答案:

答案 0 :(得分:7)

  

有一个表示冗余呼叫的标志。在示例中,它始终位于Dispose(bool disposing)方法的最后一行。这是否意味着它表明所有内容都已被处理或只是简单地保护方法执行一次运行?

模式中有两个标志:disposingdisposed

disposed开始为false,并在对象被处置后立即设置为true。 disposed的目的是使Dispose 幂等。那就是:两次调用Dispose应该是合法的,第二次不应该做任何事情。

模式中受保护的Dispose(bool)方法有两个调用方:常规Dispose方法和终结符。模式是Dispose调用Dispose(true)并且终结器调用Dispose(false),以便该方法的实现知道是否使用常规规则或终结器规则进行清理。