首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >示例中的CA2202空化流

示例中的CA2202空化流
EN

Stack Overflow用户
提问于 2018-05-31 19:17:08
回答 1查看 101关注 0票数 3

Microsoft的文档中,给出了使用streams的以下示例。

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-31 19:26:16

CA2202的标题是Do not dispose objects multiple time。我认为这是一个愚蠢的规则,因为the description of IDisposable.Dispose()在这一点上是非常的:

如果对象的Dispose方法被多次调用,则该对象必须忽略第一次之后的所有调用。如果对象的Dispose方法被多次调用,则不能引发异常。

因此,这是一个关于无问题的规则,它会导致代码变得更加复杂,而不会有任何结果!(请注意,我不是负责这件事的onlyonly )。

基本信息:StreamWriter类通常会在Close()/Dispose()上执行Close() (相当于Stream类的Dispose() ),并且据说它取得了基流的所有权。

基本的问题是正常的代码

代码语言:javascript
复制
using (stream = new FileStream("file.txt", FileMode.OpenOrCreate))
using (StreamWriter writer = new StreamWriter(stream))
{
}

将对stream进行两次Close() (一次来自StreamWriter,一次来自外部using),这是规则所不允许的。

因此,如果stream 没有获得 StreamWriter的所有权,我们希望“手动”处理StreamWriterstream

现在..。“正常”异常可以由FileStream构造函数抛出(在本例中,stream将为null,因此没有什么要清除的),或者在StreamWriter构造函数中(在本例中,stream将不是-nullwriter将为null,因此stream将需要处理,在<代码>d33块中完成)。在StreamWriter构造的末尾和stream = null;之间只能抛出异步异常,但我们将忽略它们。现在..。在构造StreamWriter并将其分配给writer之后,可以将stream标记为“我们不需要处理它”(因为StreamWriter会为我们关闭它),因此使用stream = null;。请注意,在using ()stream = null;之间放置其他行可能会在抛出异常的地方创建其他点,例如:

代码语言:javascript
复制
using (StreamWriter writer = new StreamWriter(stream))  
{ 
    if (something)
        throw new Exception();

    stream = null;  
    // Use the writer object...  
} 

但这会导致FileStream上出现双Dispose()

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50623069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档