中断声明问题-sonarqube

时间:2019-05-01 16:46:05

标签: c# foreach sonarqube

我正在使用声纳法分析我的代码,并遇到以下方法的错误

public static AllocationRuleList AsAllocationRuleList(this SIGACORD.Policy acordPolicy)
    {
        foreach (var OlifeExt in acordPolicy.OLifEExtension)
        {
            var elements = new List<XmlElement>();

            foreach (var ele in OlifeExt.Any)
            {
                if (ele.Name == "AllocationRestrictions")
                {
                    var allocationRestrictionElement = acordPolicy.OLifEExtension[0]["AllocationRestrictions"];
                    return allocationRestrictionElement.AsAllocationRuleList();
                }
            }
            break;
        }
        return null;
    }

sonarqube说我的break应该被删除或设为有条件的。但是,这在逻辑上不正确吗?

4 个答案:

答案 0 :(得分:1)

您的代码是有效的C#代码,但声纳与编译器无关。 Sonar会验证您的代码是否具有令人困惑的构造,并且这一构造令人困惑。您不想迭代只需要第一项的集合。因此,您的代码应表达您的意图。因此,您应该

var OlifeExt = acordPolicy.OLifEExtension.FirstOrDefault();
if(OlifeExt  != null)
// ...

答案 1 :(得分:1)

您的break将导致循环在第一项之后退出。这违反了循环的目的。

与此相同:

    // a for loop does nothing if there are no items in the collection
    if(acordPolicy.OLifEExtension).Any()
    {

        // no loop - we just take the first item.
        var OlifeExt = acordPolicy.First(); 
        var elements = new List<XmlElement>();

        foreach (var ele in OlifeExt.Any)
        {
            if (ele.Name == "AllocationRestrictions")
            {
                var allocationRestrictionElement = acordPolicy.OLifEExtension[0]["AllocationRestrictions"];
                return allocationRestrictionElement.AsAllocationRuleList();
            }
        }
    }
    return null;

如果您真的只想查看集合中的第一项,那么您编写的代码-第一次迭代后将带有for的{​​{1}}循环将起作用。但这令人困惑。有人必须阅读整个内容才能意识到break循环在第一项之后退出。然后他们会怀疑您是否打算这样做。然后他们会读更多的书,试图弄清到底是怎么回事。

如果您只想查看集合中的第一项,那么最好进行显式操作。

答案 2 :(得分:0)

如果break;不是基于某种条件的,那么在任何循环中都没有意义,例如:

foreach (var OlifeExt in acordPolicy.OLifEExtension)
{
  if(OlifeExt == something)
  { 
    break;
  }

  // else continue looping and do your thing
}

答案 3 :(得分:0)

“中断”表示脱离当前循环(外部foreach)。如果您要查找的值不是集合中的第一个,那么您将始终返回null。

假设这不是您的初衷,类似这样的方法应该可以更好地工作:

public static AllocationRuleList AsAllocationRuleList(this SIGACORD.Policy acordPolicy)
    {
        foreach (var OlifeExt in acordPolicy.OLifEExtension)
        {
            var restrictions = OlifeExt.FirstOrDefault(f => f.Name == "AllocationRestrictions");
            if (restrictions == null) continue;

            return restrictions.AsAllocationRuleList();
        }
        return null;
    }