我有一个函数,简化后看起来像这样:
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:
对象 'root2.Elements().GetEnumerator()' 在方法 'XmlProcessor.Merge(string, string)' 中可能被处理多次。为避免生成 System.ObjectDisposedException,您不应在一个对象上调用 Dispose 多次。
如果我删除
when
子句,则警告消失。这是怎么回事?警告是否正确?
private static XElement GetElementOrDie(XContainer container, XName elementName)
{
var element = container.Element(elementName);
if (element == null)
throw new InvalidOperationException();
return element;
}
disposable?.Dispose();
。 - juharr