在Microsoft的文档中,给出了使用streams的以下示例。
Stream stream = null;
try
{
stream = new FileStream("file.txt", FileMode.OpenOrCreate);
using (StreamWriter writer = new StreamWriter(stream))
{
stream = null;
// Use the writer object...
}
}
finally
{
if(stream != null)
stream.Dispose();
}
现在我想知道为什么要在使用编写器对象之前设置stream = null
?
发布于 2018-05-31 19:26:16
CA2202的标题是Do not dispose objects multiple time。我认为这是一个愚蠢的规则,因为the description of IDisposable.Dispose()在这一点上是非常的:
如果对象的Dispose方法被多次调用,则该对象必须忽略第一次之后的所有调用。如果对象的Dispose方法被多次调用,则不能引发异常。
因此,这是一个关于无问题的规则,它会导致代码变得更加复杂,而不会有任何结果!(请注意,我不是负责这件事的only和only )。
基本信息:StreamWriter
类通常会在Close()
/Dispose()
上执行Close()
(相当于Stream
类的Dispose()
),并且据说它取得了基流的所有权。
基本的问题是正常的代码
using (stream = new FileStream("file.txt", FileMode.OpenOrCreate))
using (StreamWriter writer = new StreamWriter(stream))
{
}
将对stream
进行两次Close()
(一次来自StreamWriter
,一次来自外部using
),这是规则所不允许的。
因此,如果stream
没有获得 StreamWriter
的所有权,我们希望“手动”处理StreamWriter
的stream
。
现在..。“正常”异常可以由FileStream
构造函数抛出(在本例中,stream
将为null
,因此没有什么要清除的),或者在StreamWriter
构造函数中(在本例中,stream
将不是-null
和writer
将为null
,因此stream
将需要处理,在<代码>d33块中完成)。在StreamWriter
构造的末尾和stream = null;
之间只能抛出异步异常,但我们将忽略它们。现在..。在构造StreamWriter
并将其分配给writer
之后,可以将stream
标记为“我们不需要处理它”(因为StreamWriter
会为我们关闭它),因此使用stream = null;
。请注意,在using ()
和stream = null;
之间放置其他行可能会在抛出异常的地方创建其他点,例如:
using (StreamWriter writer = new StreamWriter(stream))
{
if (something)
throw new Exception();
stream = null;
// Use the writer object...
}
但这会导致FileStream
上出现双Dispose()
。
https://stackoverflow.com/questions/50623069
复制相似问题