为什么嵌套的using块会多次处理对象?

本文关键字:处理 对象 嵌套 using 为什么 | 更新日期: 2023-09-27 18:12:41

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

参考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就像它建议的,我只是想知道为什么它的方式工作。

这是最好的方式生成的代码可以解释,"好吧,作为使用块关闭,让我处置所有的对象。"还是有一个原因,它的工作方式?

为什么嵌套的using块会多次处理对象?

using块本身不会超过一次地处理任何内容。

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

这在实践中不是问题,因为Stream可以安全地处理多次。如果必须完全正确,仍然可以通过使用适当的StreamWriter构造函数使流只被处理一次,从而使编写器不获得流的所有权。

释放StreamWriter也释放了底层流。您可以配置StreamWriter不这样做。

主观注释:也就是说,这个警告是虚假的和无益的,因为多次处理对象通常是安全的(如果这些对象遵循共同的处理模式)。