当我像这样包装IDisposable对象时,我得到代码分析警告代码分析错误CA2202: Do not dispose objects multiple times,http://msdn.microsoft.com/en-us/library/ms182334.aspx
using (StringWriter textWriter = new StringWriter())
{
using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
{
serializer.Serialize(xmlWriter, value);
}
return textWriter.ToString();
}但是,这不会返回任何错误
using (StringWriter textWriter = new StringWriter())
{
XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings);
serializer.Serialize(xmlWriter, value);
return textWriter.ToString();
}同样,在执行此操作时,xmlWriter dispose将触发CA2202
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();
}我应该使用哪种模式?不处理一次性元素似乎很奇怪。
发布于 2014-05-14 21:56:48
则内部using语句XmlWriter的结尾将被释放。当发生这种情况时,textWriter元素也会被释放,因为XmlWriter会在内部释放它包装的对象。
因为Dispose应该是幂等的(可重复调用没有副作用),所以我不会担心这个警告。
发布于 2014-05-14 21:55:40
一个简单的谷歌搜索结果:https://stackoverflow.com/a/8096857/2027232
问题不是因为嵌套使用。它们很好,并且通常被推荐使用。这里的问题是,如果您使用CloseInput == true传递一个TextReader,XmlReader将处理该XmlReaderSettings,但是CA2202规则不够智能,您的代码不会继续执行该分支。保留您的嵌套使用,并将CA2202违规视为误报。如果要格外小心,可以使用CloseInput设置为false的XmlReaderSettings,但这是默认值,因此不是必须的。
顺便说一句,对于各种流和阅读器类型,都有类似的CA2202问题场景。不幸的是,它们并不都与这个相同,所以最好的案例处理可能会根据导致问题的类型而有所不同。
https://stackoverflow.com/questions/23656629
复制相似问题