为什么使用`switch`的代码的循环复杂度要高于使用'if-else'的代码的循环复杂度

时间:2020-03-18 07:29:59

标签: c# visual-studio code-metrics cyclomatic-complexity

我有两个示例函数TestComplexityIfTestComplexitySwitch。 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;
    }
}

1 个答案:

答案 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 codevisualize CC values in a colored treemap并运行some rules to forbid too complex methods

Colored Treemap Cyclomatic Complexity

(免责声明,我为NDepend工作)