如下面的示例实现,即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();
}
}
}
}
答案 0 :(得分:7)
有一个表示冗余呼叫的标志。在示例中,它始终位于Dispose(bool disposing)方法的最后一行。这是否意味着它表明所有内容都已被处理或只是简单地保护方法执行一次运行?
模式中有两个标志:disposing
和disposed
。
disposed
开始为false,并在对象被处置后立即设置为true。 disposed
的目的是使Dispose
幂等。那就是:两次调用Dispose
应该是合法的,第二次不应该做任何事情。
模式中受保护的Dispose(bool)
方法有两个调用方:常规Dispose
方法和终结符。模式是Dispose
调用Dispose(true)
并且终结器调用Dispose(false)
,以便该方法的实现知道是否使用常规规则或终结器规则进行清理。