【问题标题】:Why does a nested using block dispose objects multiple times? [duplicate]为什么嵌套的 using 块会多次处理对象? [复制]
【发布时间】:2014-07-11 14:00:18
【问题描述】:

为什么嵌套的 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 块正在关闭,让我处理所有对象。”还是有理由让它以这种方式工作?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    using 块本身不会处理任何东西超过一次。

    “问题”(它确实需要引号,因为它只是最抽象的数学意义上的问题)是在这种特定情况下,StreamWriter 拥有底层流的所有权,所以当作者被处置时通过内部using,它也会自动处理流。然后外部的using 再次处理流。

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

    【讨论】:

      【解决方案2】:

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

      主观说明:这表示此警告是虚假且无益的,因为多次处理对象通常是安全的(如果这些对象遵循常见的处理模式。所有 BCL 对象都可以安全地多次处理)。

      【讨论】:

      • 是的,IDisposable 的部分实施指南是它应该能够容忍多次调用。
      • 你如何配置Streamwriter 不这样做呢?
      • @Chris 有一个构造函数参数。如果没有必要,我不建议使用它。在这里,没有必要。警告只是迂腐的垃圾。不能帮助任何人完成工作。
      • 啊酷。我确实想知道。我只是认为,如果您要提到可以配置它,那么也值得一提。
      猜你喜欢
      • 2011-02-10
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 1970-01-01
      • 2014-04-04
      • 1970-01-01
      相关资源
      最近更新 更多