为啥嵌套的 using 块会多次处理对象? [复制]

Posted

技术标签:

【中文标题】为啥嵌套的 using 块会多次处理对象? [复制]【英文标题】: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 块正在关闭,让我处理所有对象。”还是有理由让它以这种方式工作?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

是的,IDisposable 的部分实施指南是它应该能够容忍多次调用。 你如何配置Streamwriter 不这样做呢? @Chris 有一个构造函数参数。如果没有必要,我不建议使用它。在这里,没有必要。警告只是迂腐的垃圾。不能帮助任何人完成工作。 啊酷。我确实想知道。我只是认为,如果您要提到可以配置它,那么也值得一提。

以上是关于为啥嵌套的 using 块会多次处理对象? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

div中设置背景图片,这个div中再嵌套一个div,并且设置margin-top为啥嵌套的块会移出去

为啥添加 try 块会使程序更快?

在 Vue.js 中使用 v-for 多次渲染时,表单块会混乱

为啥冗余的额外范围块会影响 std::lock_guard 行为?

为啥触摸 SCNView 顶部的滑块会在 iOS 8/Swift 上将相机移动到下方?

为啥 .css 可以处理这个 Nokogiri 对象而不是 XPath? [复制]