break 语句问题 - sonarqube

break statement issue - sonarqube

我正在使用 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 应该被删除或有条件。但是,这在逻辑上不是正确的吗?

您的代码是有效的 c# 代码,但声纳与编译器无关。 Sonar 会验证您的代码是否有令人困惑的结构,而这个结构是否令人困惑。您不想迭代您只想要第一个项目的集合。所以你的代码应该表达你的意图吧。所以你应该做

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

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

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

  // else continue looping and do your thing
}

"break" 表示跳出当前循环(外层foreach)。如果您要查找的值不是集合中的第一个值,那么您将始终 return 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;
    }

您的 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;

如果您真的只想查看集合中的第一项,那么您编写的代码 - 在第一次迭代后带有 breakfor 循环 - 将起作用。但这很混乱。有人必须阅读整个内容才能意识到 for 循环在第一项之后退出。然后他们会想知道你是否打算这样做。然后他们会阅读更多内容,试图弄清楚发生了什么。

如果您只想查看集合中的第一项,那么最好明确地执行此操作。