Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dispose(bool)中disposed标志的确切含义是什么?_C#_Design Patterns_Idisposable - Fatal编程技术网

C# Dispose(bool)中disposed标志的确切含义是什么?

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)

如下示例实现,即有一个标志指示冗余调用。在示例中,它总是在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();
            }
        }            
    }
}
有一个标志指示冗余呼叫。在示例中,它总是在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:我不知道,这对你合适吗?在处理资源时失败会给用户带来什么后果?你是能回答这个问题的人,不是我。编写用户需要您编写的代码。