为啥嵌套的 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为啥嵌套的块会移出去
在 Vue.js 中使用 v-for 多次渲染时,表单块会混乱
为啥冗余的额外范围块会影响 std::lock_guard 行为?