为什么嵌套的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
块本身不会超过一次地处理任何内容。
"问题"(它确实需要引号,因为它只是一个最抽象的数学意义上的问题)是,在这个特定的场景中,StreamWriter
占有底层流的所有权,所以当写入器被内部using
处理时,它也会自动处理流。然后外部的using
继续处理流。
这在实践中不是问题,因为Stream
可以安全地处理多次。如果必须完全正确,仍然可以通过使用适当的StreamWriter
构造函数使流只被处理一次,从而使编写器不获得流的所有权。
释放StreamWriter
也释放了底层流。您可以配置StreamWriter
不这样做。
主观注释:也就是说,这个警告是虚假的和无益的,因为多次处理对象通常是安全的(如果这些对象遵循共同的处理模式)。