为什么嵌套的使用块会多次处理一个对象?
参考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
,就像它建议的那样,我只想知道它为什么会这样运作。
这是生成代码解释的最佳方式,“好吧,因为使用块正在关闭,让我处理所有对象。”或者是否有理由以这种方式工作?
答案 0 :(得分:9)
using
区块本身不会再处置任何内容。
"问题" (它确实需要引号,因为它只是最抽象的数学意义上的问题)是在这个特定场景中StreamWriter
取得了底层流的所有权,所以当编写者被处理时内部using
它也会自动处理流。然后外部using
继续处理流。
这在实践中不是问题,因为Stream
可以安全地多次处理。如果您必须具有完全正确性,则仍然可以使用the appropriate StreamWriter
constructor使流仅处理一次,这会导致编写者不取得流的所有权。
答案 1 :(得分:6)
处置StreamWriter
也处理了基础流。您可以将StreamWriter
配置为不执行此操作。
主观说明:说这个警告是假的,没有用,因为多次处理物品通常是安全的(如果这些物体符合公共处置模式。所有BCL物品都可以安全地多次处理。)