首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >异常筛选器触发CA2202?

异常筛选器触发CA2202?
EN

Stack Overflow用户
提问于 2016-02-04 14:33:46
回答 1查看 235关注 0票数 3

我有一个功能,经过简化,看起来是这样的:

代码语言:javascript
复制
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子句,警告就会消失。

这里发生了什么事?警告我是对的吗?

供参考:

代码语言:javascript
复制
private static XElement GetElementOrDie(XContainer container, XName elementName)
{
   var element = container.Element(elementName);
   if (element == null)
      throw new InvalidOperationException();
   return element;
}
EN

回答 1

Stack Overflow用户

发布于 2016-02-05 22:17:05

我认为这是代码分析的一个问题,我会抑制它。如果我将循环转换为:

代码语言:javascript
复制
foreach (var element in root2.Elements())
   root1.Add(element);

为了公开枚举数,它会显式地抱怨:

代码语言:javascript
复制
var enumerator = root2.Elements().GetEnumerator();
while (enumerator.MoveNext())
{
    XElement item = enumerator.Current;
    root1.Add(item);
}

那么就不会再抛出CA2202了,即使在异常情况下使用when文件也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35203767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档