WPF代码分析:CA2202 Do not dispose objects multiple timesObject

Posted

技术标签:

【中文标题】WPF代码分析:CA2202 Do not dispose objects multiple timesObject【英文标题】:WPF code analyze : CA2202 Do not dispose objects multiple timesObject 【发布时间】:2015-06-22 08:00:26 【问题描述】:

在我的 WPF 应用程序代码中,我收到以下警告:

CA2202 不要多次处理对象 对象“fs”可以 在方法中多次处理 'MainWindow.TestResults_Click(对象,RoutedEventArgs)'。避免 生成一个您不应该调用的 System.ObjectDisposedException 在一个物体上多次处理。 :行: 第429章 429

代码:

FileStream fs = new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "TestResult.htm", FileMode.Create);
using (fs)

    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
    
        w.WriteLine(GetTestResultshtml());
    

这些警告的原因是什么?

【问题讨论】:

相关***.com/questions/11192445/… ***.com/questions/3831676/… 提供了您问题前半部分的答案 【参考方案1】:

嵌套 using 语句可能导致违反 CA2202 警告。如果嵌套内部 using 语句的 IDisposable 资源包含外部 using 语句的资源,则嵌套资源的 Dispose 方法释放包含的资源。当这种情况发生时,外部 using 语句的 Dispose 方法会尝试第二次释放其资源。 在下面的示例中,在包含流对象的 StreamWriter 对象的 Dispose 方法中,在外部 using 语句中创建的 Stream 对象在内部 using 语句的末尾释放。在外部 using 语句的末尾,流对象被第二次释放。第二个版本违反了CA2202。

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))

    using (StreamWriter writer = new StreamWriter(stream))
    
        // Use the writer object...
    

要解决此问题,请使用 try/finally 块而不是外部 using 语句。在 finally 块中,确保流资源不为空。

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();

【讨论】:

【参考方案2】:

在这种情况下,我个人会使用:

public StreamWriter(
    string path,
    bool append
)

为指定的 StreamWriter 类初始化一个新实例 文件使用默认编码和缓冲区大小。如果文件 存在,它可以被覆盖或附加到。如果文件没有 不存在,此构造函数创建一个新文件。

但是没有好的解决方案,见CA2202, how to solve this case

【讨论】:

以上是关于WPF代码分析:CA2202 Do not dispose objects multiple timesObject的主要内容,如果未能解决你的问题,请参考以下文章

MemoryStream、XmlTextWriter 和警告 4 CA2202:Microsoft.Usage

解读澳洲嵌入式灯具防火等级 Non-IC Do-not-cover CA90 CA135 IC IC-4 具体要求。

解读澳洲嵌入式灯具防火等级 Non-IC Do-not-cover CA90 CA135 IC IC-4 具体要求。

解读澳洲嵌入式灯具防火等级 Non-IC Do-not-cover CA90 CA135 IC IC-4 具体要求。

WPF 应用程序:Microsoft.Maintainability#CA1506 签名无效 FxCop 违规

您不应在一个对象上多次调用 Dispose(CA2202)[重复]