WPF代码分析:CA2202不要多次配置对象

时间:2015-06-22 08:00:26

标签: c# wpf code-analysis

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

  

CA2202不要多次处置对象'对象'fs'即可   方法不止一次处理   'MainWindow.TestResults_Click(object,RoutedEventArgs)'。避免   生成一个不应该调用的System.ObjectDisposedException   在物体上放置多次。 :行:   429 yesMonitor MainWindow.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());
    }
}

这些警告应该是什么原因?

2 个答案:

答案 0 :(得分:2)

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

"require": {
    ...
    "liip/imagine-bundle": "1.3.0",
    ...
}

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

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

答案 1 :(得分:0)

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

public StreamWriter(
    string path,
    bool append
)
  

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

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