WPF 代码分析:CA2202 不要多次释放对象对象
本文关键字:对象 释放 CA2202 代码 WPF | 更新日期: 2023-09-27 17:57:24
在我的WPF应用程序代码中,我收到以下警告:
CA2202 不要多次处置对象 对象"fs"可以是 在方法中多次处理 'MainWindow.TestResults_Click(object, RoutedEventArgs)'.要避免 生成不应调用的 System.ObjectDisposedException 在一个对象上释放多个时间。:线: 429 是监视主窗口.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());
}
}
发出这些警告的原因应该是什么?
嵌套的 using 语句可能会导致违反 CA2202 警告。如果嵌套的内部 using 语句的 IDisposable 资源包含外部 using 语句的资源,则嵌套资源的 Dispose 方法将释放包含的资源。发生这种情况时,外部 using 语句的 Dispose 方法将尝试第二次释放其资源。在下面的示例中,在外部 using 语句中创建的 Stream 对象在包含流对象的 StreamWriter 对象的 Dispose 方法中的内部 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 块中,确保流资源不为 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 类的新实例 文件,使用默认编码和缓冲区大小。如果文件 存在,可以覆盖或追加。如果文件有 不存在,此构造函数创建一个新文件。
但是没有好的解决方案,见CA2202,如何解决这种情况