在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
复制相似问题