为什么嵌套的使用块会多次配置对象?

时间:2014-07-11 14:00:18

标签: c# .net

为什么嵌套的使用块会多次处理一个对象?

参考CA2202

  

在以下示例中,在外部创建的Stream对象   using语句在内部using语句的末尾发布   包含流的StreamWriter对象的Dispose方法   宾语。在外部using语句的末尾,流对象是   第二次发布。第二个版本违反了CA2202。

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

我知道在大多数情况下我可以使用

using ()
using ()
{ }

如果我不能,我很乐意回复try finally,就像它建议的那样,我只想知道它为什么会这样运作。

这是生成代码解释的最佳方式,“好吧,因为使用块正在关闭,让我处理所有对象。”或者是否有理由以这种方式工作?

2 个答案:

答案 0 :(得分:9)

using区块本身不会再处置任何内容。

"问题" (它确实需要引号,因为它只是最抽象的数学意义上的问题)是在这个特定场景中StreamWriter取得了底层流的所有权,所以当编写者被处理时内部using它也会自动处理流。然后外部using继续处理流。

这在实践中不是问题,因为Stream可以安全地多次处理。如果您必须具有完全正确性,则仍然可以使用the appropriate StreamWriter constructor使流仅处理一次,这会导致编写者不取得流的所有权。

答案 1 :(得分:6)

处置StreamWriter也处理了基础流。您可以将StreamWriter配置为不执行此操作。

主观说明:说这个警告是假的,没有用,因为多次处理物品通常是安全的(如果这些物体符合公共处置模式。所有BCL物品都可以安全地多次处理。)