在我的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());
}
}
这些警告应该是什么原因?
答案 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