我有两个示例函数TestComplexityIf
和TestComplexitySwitch
。 VisualStudio-2017“计算代码指标”工具报告,对于带有switch
的语句,带有if-else
语句的函数的循环复杂度为10,而广告7。我不知道如何计算TestComplexitySwitch()的复杂度。
private static void TestComplexityIf(String arg)
{
if (arg == "a")
{ }
else if (arg == "b")
{ }
else if (arg == "c")
{ }
else if (arg == "d")
{ }
else if (arg == "d")
{ }
else if (arg == "f")
{ }
else if (arg == "g")
{ }
}
private static void TestComplexitySwitch(String arg)
{
switch (arg)
{
case "a":
break;
case "b":
break;
case "c":
break;
case "d":
break;
case "e":
break;
case "f":
break;
case "g":
break;
}
}
此外,如果我评论最后一种情况,复杂度突然变为6。
private static void TestComplexitySwitch(String arg)
{
switch (arg)
{
case "a":
break;
case "b":
break;
case "c":
break;
case "d":
break;
case "e":
break;
case "f":
break;
//case "g":
//break;
}
}
答案 0 :(得分:2)
Visual Studio循环复杂度(CC)工具从IL代码计算值,因此要遵守编译器的详细信息。
这是您对性能编译器详细信息的绊脚石:当字符串上的 switch 严格超过6个 cases 时,编译器将创建哈希表以进行快速字符串搜索。该哈希表不会出现在C#代码中,而只会出现在IL代码中。 IL代码变得更加复杂以处理此哈希表,并且您获得了意外的CC值。 this link from Michael Randall很好地说明了这种情况。
或者,您可以使用工具NDepend来compute the CC from C# source code,visualize CC values in a colored treemap并运行some rules to forbid too complex methods。
(免责声明,我为NDepend工作)