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;
如果您真的只想查看集合中的第一项,那么您编写的代码 - 在第一次迭代后带有 break
的 for
循环 - 将起作用。但这很混乱。有人必须阅读整个内容才能意识到 for
循环在第一项之后退出。然后他们会想知道你是否打算这样做。然后他们会阅读更多内容,试图弄清楚发生了什么。
如果您只想查看集合中的第一项,那么最好明确地执行此操作。
我正在使用 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;
如果您真的只想查看集合中的第一项,那么您编写的代码 - 在第一次迭代后带有 break
的 for
循环 - 将起作用。但这很混乱。有人必须阅读整个内容才能意识到 for
循环在第一项之后退出。然后他们会想知道你是否打算这样做。然后他们会阅读更多内容,试图弄清楚发生了什么。
如果您只想查看集合中的第一项,那么最好明确地执行此操作。