我正在使用声纳法分析我的代码,并遇到以下方法的错误
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
应该被删除或设为有条件的。但是,这在逻辑上不正确吗?
答案 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;
}