C# WPF代码分析:CA2202不处理对象多时间对象

C# WPF代码分析:CA2202不处理对象多时间对象,c#,wpf,code-analysis,C#,Wpf,Code Analysis,在我的WPF应用程序代码中,我得到了以下警告: CA2202不要多次处理对象对象“fs” 在方法中多次处理 'MainWindow.TestResults\u单击(对象,RoutedEventArgs)'。避 生成不应调用的System.ObjectDisposedException 对一个对象进行多次处置:线: 429 yesMonitor main window.xaml.cs 429 代码: FileStream fs = new FileStream(System.AppDomain.C

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

CA2202不要多次处理对象对象“fs” 在方法中多次处理 'MainWindow.TestResults\u单击(对象,RoutedEventArgs)'。避 生成不应调用的System.ObjectDisposedException 对一个对象进行多次处置:线: 429 yesMonitor main window.xaml.cs 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());
    }
}

这些警告的原因是什么?

嵌套使用语句可能会导致违反CA2202警告。如果嵌套的内部using语句的IDisposable资源包含外部using语句的资源,则嵌套资源的Dispose方法将释放包含的资源。出现这种情况时,outerusing语句的Dispose方法会再次尝试处置其资源。 在以下示例中,在包含流对象的StreamWriter对象的Dispose方法中,在外部using语句中创建的流对象在内部using语句的末尾被释放。在OuterUsing语句的末尾,第二次释放流对象。第二次发布违反了CA2202

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}
要解决此问题,请使用try/finally块,而不是外部using语句。在finally块中,确保流资源不为null

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

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

public StreamWriter(
    string path,
    bool append
)
为指定对象初始化StreamWriter类的新实例 使用默认编码和缓冲区大小创建文件。如果文件 存在时,可以将其覆盖或附加到。如果文件有 不存在,此构造函数将创建一个新文件

但是没有好的解决方案,请参见

Related提供问题前半部分的答案