我有一个功能,煮熟了,看起来像这样:
public static string Merge(string xml1, string xml2)
{
try
{
var doc1 = XDocument.Load(new StringReader(xml1));
var doc2 = XDocument.Load(new StringReader(xml2));
// these "die" by throwing InvalidOperationException
var root1 = GetElementOrDie(doc1, Names.RootElementName);
var root2 = GetElementOrDie(doc2, Names.RootElementName);
foreach (var element in root2.Elements())
root1.Add(element);
return doc1.ToString();
}
catch (Exception e) when (!(e is InvalidOperationException))
{
throw new InvalidOperationException(e.Message, e);
}
}
在Visual Studio 2015下,这会生成代码分析警告CA2202:
Object' root2.Elements()。GetEnumerator()'可以多处理 一旦进入方法' XmlProcessor.Merge(string,string)'。避免 生成一个不应该调用的System.ObjectDisposedException 在物体上多次处理。
如果删除when
子句,则警告消失。
这里发生了什么?警告我是对的吗?
供参考:
private static XElement GetElementOrDie(XContainer container, XName elementName)
{
var element = container.Element(elementName);
if (element == null)
throw new InvalidOperationException();
return element;
}
答案 0 :(得分:1)
我认为这是代码分析的一个问题,我会压制它。如果我转换循环:
foreach (var element in root2.Elements())
root1.Add(element);
以揭露它明确抱怨的调查员:
var enumerator = root2.Elements().GetEnumerator();
while (enumerator.MoveNext())
{
XElement item = enumerator.Current;
root1.Add(item);
}
然后CA2202
不再被抛出,即使异常使用when
文件管理器也是如此。