我有一个功能,经过简化,看起来是这样的:
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 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;
}发布于 2016-02-05 22:17:05
我认为这是代码分析的一个问题,我会抑制它。如果我将循环转换为:
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文件也是如此。
https://stackoverflow.com/questions/35203767
复制相似问题