C# Dispose(bool)中disposed标志的确切含义是什么?
如下示例实现,即有一个标志指示冗余调用。在示例中,它总是在Dispose(bool disposing)方法的最后一行。这是否意味着它表明一切都已被处理,或者只是简单地保护方法执行一次C# Dispose(bool)中disposed标志的确切含义是什么?,c#,design-patterns,idisposable,C#,Design Patterns,Idisposable,如下示例实现,即有一个标志指示冗余调用。在示例中,它总是在Dispose(bool disposing)方法的最后一行。这是否意味着它表明一切都已被处理,或者只是简单地保护方法执行一次 private bool disposed = false; // To detect redundant calls protected virtual void Dispose(bool disposing) { if (!disposed) { if (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();
}
}
}
}
有一个标志指示冗余呼叫。在示例中,它总是在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;
}
}
模式中有两个标志:disposing
和disposed
disposed
启动false,并在对象被释放后立即设置为true。disposed
的目的是使Dispose
成为幂等元。也就是说:调用Dispose
两次应该是合法的,第二次应该什么都不做
模式中受保护的
Dispose(bool)
方法有两个调用者:常规Dispose
方法和终结器。模式是Dispose
调用Dispose(true)
,终结器调用Dispose(false)
,以便方法的实现知道是使用普通规则还是终结器规则进行清理。在第二个示例中,如果this.cache.Dispose()中存在异常
然后this.dispose==true
这可能是可取的,也可能是不可取的。顺便说一句,您应该在所有实例成员访问之前加上this.
,以避免将字段与局部变量混淆。但是,如果不关心this.cache.Dispose()中的异常是一种理想情况,那么在try-catch块中用空catch将该行包装起来不是更好吗?但是如果this.cache.Dispose()
将引发异常,可以在try catch
中处理该异常,以尝试“解除阻止”缓存
并再次调用Dispose
。如果开始时将disposed
设置为true,则第二次调用Dispose
将无效。@zimyslaw:让Dispose抛出。如果它抛出一次,为什么你认为第二次调用它会让事情变得更好呢?那么,在请求时将其设置为真,并且不担心处理资源会失败,这样可以吗?模式的所有示例显示disposed=true
作为最后一条指令-我的理解是标志表明我们成功地处理了所有事情-所以最好的名称应该是isEverythingDisposed
@Zimyslaw:我不知道,这对你合适吗?在处理资源时失败会给用户带来什么后果?你是能回答这个问题的人,不是我。编写用户需要您编写的代码。