在我的WPF应用程序代码中,我收到了以下警告:
CA2202不多次释放对象,可以在方法'MainWindow.TestResults_Click( Object,RoutedEventArgs)中多次释放对象'fs‘。为了避免生成System.ObjectDisposedException,您不应该对对象调用Dispose超过一次。::行: 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());
}
}提出这些警告的原因应该是什么?
发布于 2015-06-22 08:07:49
嵌套使用语句可能导致违反CA2202警告。如果嵌套内部the语句的IDisposable资源包含外部the语句的资源,则嵌套资源的Dispose方法释放包含的资源。当发生这种情况时,外部Dispose语句的dispose方法将尝试第二次释放其资源。在下面的示例中,在外部using语句中创建的Stream对象在包含流对象的StreamWriter对象的Dispose方法的内部the语句的末尾释放。在外部the语句的末尾,流对象第二次被释放。第二个版本违反了CA2202。
using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
using (StreamWriter writer = new StreamWriter(stream))
{
// Use the writer object...
}
}若要解决此问题,请使用try/finally块而不是外部use语句。在“最后”块中,确保流资源不是空的。
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();
}发布于 2015-06-22 09:22:34
就个人而言,在这种情况下,我会使用:
public StreamWriter(
string path,
bool append
)使用默认编码和缓冲区大小初始化指定文件的StreamWriter类的新实例。如果文件存在,则可以覆盖或附加到该文件。如果该文件不存在,则此构造函数将创建一个新文件。
但是没有好的解决方案,请参阅CA2202, how to solve this case
https://stackoverflow.com/questions/30974753
复制相似问题