首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF代码分析: CA2202不处理多个timesObject对象

WPF代码分析: CA2202不处理多个timesObject对象
EN

Stack Overflow用户
提问于 2015-06-22 08:00:26
回答 2查看 98关注 0票数 2

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

CA2202不多次释放对象,可以在方法'MainWindow.TestResults_Click( Object,RoutedEventArgs)中多次释放对象'fs‘。为了避免生成System.ObjectDisposedException,您不应该对对象调用Dispose超过一次。::行: 429 yesMonitor MainWindow.xaml.cs 429

密码:

代码语言:javascript
复制
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());
    }
}

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-22 08:07:49

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

代码语言:javascript
复制
using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

若要解决此问题,请使用try/finally块而不是外部use语句。在“最后”块中,确保流资源不是空的。

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2015-06-22 09:22:34

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

代码语言:javascript
复制
public StreamWriter(
    string path,
    bool append
)

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30974753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档