异常过滤器触发CA2202?

时间:2016-02-04 14:33:46

标签: c# visual-studio-2015 compiler-warnings code-analysis c#-6.0

我有一个功能,煮熟了,看起来像这样:

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;
}

1 个答案:

答案 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文件管理器也是如此。