为什么这些方法的圈复杂度如此之高?

时间:2013-12-09 22:20:30

标签: c# visual-studio-2012 code-metrics

使用Visual Studio计算度量标准。

第一种方法有CC = 4

    private IEnumerable<string> GetRows(DataTable dt, string columnDelimiter)
    {
        return from DataRow row in dt.Rows
               select string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
    }

第二种方法有CC = 5.

    private IEnumerable<string> GetRowsForeach(DataTable dt, string columnDelimiter)
    {
        var rows = new List<string>();
        foreach (DataRow row in dt.Rows)
        {
            var rowString = string.Join(columnDelimiter, row.ItemArray.Select(k => k.ToString()));
            rows.Add(rowString);
        }

        return rows;
    }

我说第一种方法应该有CC = 1而第二种方法可能是CC = 1或者可能是2(对于最终情况我们也不会理解。但我永远不会说他们的CC是如此之高。我误解了什么? ?

2 个答案:

答案 0 :(得分:3)

这是一个不完美的工具。它看到了IL,这是由C#编译器生成的代码。它没有看到您的代码。 C#中有很多语法糖,旨在使您的代码易于理解,但在水线之下有一个代码生成的冰山。查询理解肯定符合这种模式。

仅使用CC作为指导,永远不要让它设定规则,永远不要让它痉挛你的风格。你的大脑胜过任何工具。

答案 1 :(得分:2)

显然,这是因为使用linq方法生成的每个IEnumerator也会实现一个IDisposable,为了正确释放,将把代码包装在try..catch块中。

here有一个很好的解释。

在你的第一个例子中,你有两个select语句和一个连接,因此计数为4。