WPF 代码分析:CA2202 不要多次处理对象
WPF code analyze : CA2202 Do not dispose objects multiple timesObject
在我的 WPF 应用程序代码中,我收到以下警告:
CA2202 Do not dispose objects multiple times Object 'fs' can be
disposed more than once in method
'MainWindow.TestResults_Click(object, RoutedEventArgs)'. To avoid
generating a System.ObjectDisposedException you should not call
Dispose more than one time on an object. : Lines:
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());
}
}
出现这些警告的原因是什么?
嵌套的 using 语句会导致违反 CA2202 警告。如果嵌套内部 using 语句的 IDisposable 资源包含外部 using 语句的资源,则嵌套资源的 Dispose 方法释放包含的资源。发生这种情况时,外部 using 语句的 Dispose 方法会尝试第二次释放其资源。
在下面的示例中,在包含流对象的 StreamWriter 对象的 Dispose 方法中,在外部 using 语句中创建的 Stream 对象在内部 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 块中,确保流资源不为空。
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
)
Initializes a new instance of the StreamWriter class for the specified
file by using the default encoding and buffer size. If the file
exists, it can be either overwritten or appended to. If the file does
not exist, this constructor creates a new file.
但是没有好的解决办法,看CA2202, how to solve this case
在我的 WPF 应用程序代码中,我收到以下警告:
CA2202 Do not dispose objects multiple times Object 'fs' can be disposed more than once in method 'MainWindow.TestResults_Click(object, RoutedEventArgs)'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object. : Lines: 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());
}
}
出现这些警告的原因是什么?
嵌套的 using 语句会导致违反 CA2202 警告。如果嵌套内部 using 语句的 IDisposable 资源包含外部 using 语句的资源,则嵌套资源的 Dispose 方法释放包含的资源。发生这种情况时,外部 using 语句的 Dispose 方法会尝试第二次释放其资源。 在下面的示例中,在包含流对象的 StreamWriter 对象的 Dispose 方法中,在外部 using 语句中创建的 Stream 对象在内部 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 块中,确保流资源不为空。
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
)
Initializes a new instance of the StreamWriter class for the specified file by using the default encoding and buffer size. If the file exists, it can be either overwritten or appended to. If the file does not exist, this constructor creates a new file.
但是没有好的解决办法,看CA2202, how to solve this case