首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用CA2202包装多个IDisposables

使用CA2202包装多个IDisposables
EN

Stack Overflow用户
提问于 2014-05-14 21:51:11
回答 2查看 608关注 0票数 1

当我像这样包装IDisposable对象时,我得到代码分析警告代码分析错误CA2202: Do not dispose objects multiple timeshttp://msdn.microsoft.com/en-us/library/ms182334.aspx

代码语言:javascript
复制
using (StringWriter textWriter = new StringWriter())
{
    using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
    {
        serializer.Serialize(xmlWriter, value);
    }
    return textWriter.ToString();
}

但是,这不会返回任何错误

代码语言:javascript
复制
using (StringWriter textWriter = new StringWriter())
{
    XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings);
    serializer.Serialize(xmlWriter, value);
    return textWriter.ToString();
}

同样,在执行此操作时,xmlWriter dispose将触发CA2202

代码语言:javascript
复制
StringWriter textWriter = null;
XmlWriter xmlWriter = null;

try
{
    textWriter = new StringWriter();
    xmlWriter = XmlWriter.Create(textWriter, settings);
    serializer.Serialize(xmlWriter, value);
    return textWriter.ToString();
}
finally
{
    if (textWriter != null)
        textWriter.Dispose();
    // The xmlWriter dispose will trigger CA2202
    if (xmlWriter != null)
        xmlWriter.Dispose();
}

我应该使用哪种模式?不处理一次性元素似乎很奇怪。

EN

回答 2

Stack Overflow用户

发布于 2014-05-14 21:56:48

则内部using语句XmlWriter的结尾将被释放。当发生这种情况时,textWriter元素也会被释放,因为XmlWriter会在内部释放它包装的对象。

因为Dispose应该是幂等的(可重复调用没有副作用),所以我不会担心这个警告。

票数 2
EN

Stack Overflow用户

发布于 2014-05-14 21:55:40

一个简单的谷歌搜索结果:https://stackoverflow.com/a/8096857/2027232

问题不是因为嵌套使用。它们很好,并且通常被推荐使用。这里的问题是,如果您使用CloseInput == true传递一个TextReaderXmlReader将处理该XmlReaderSettings,但是CA2202规则不够智能,您的代码不会继续执行该分支。保留您的嵌套使用,并将CA2202违规视为误报。如果要格外小心,可以使用CloseInput设置为falseXmlReaderSettings,但这是默认值,因此不是必须的。

顺便说一句,对于各种流和阅读器类型,都有类似的CA2202问题场景。不幸的是,它们并不都与这个相同,所以最好的案例处理可能会根据导致问题的类型而有所不同。

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

https://stackoverflow.com/questions/23656629

复制
相关文章

相似问题

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