VS Code指标如何进行数学计算

时间:2018-05-17 19:30:14

标签: c# visual-studio linq cil code-metrics

我一直在挖掘,我无法得到一个让我信服的答案。直到最近,我才认为代码行的数量仅取决于完整的代码行,我的意思是,每行代码都有一个真正的目的,或多或少是MSDN表示计数是基于IL代码;但后来我遇到了这样的案子......

public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values)
{
    var listX = values.Where(x => !string.IsNullOrEmpty(x)).Select(y => y).Where(w => w.StartsWith("x"));
    return listX;
}

Code Metrics Result

...代码行的计数器计数6条不同的行。有人可以告诉我究竟发生了什么,IL如何解释linq查询,因为它会产生3行不同的代码行;甚至更多我如何解释使用linq制动每种方法的线数规则? 感谢

1 个答案:

答案 0 :(得分:1)

作为使用IL近似代码行的一部分,lambda表达式被计算为好像它们是单独定义的方法。

您的样本LINQ查询有3个lambda表达式(一个无效Select和两个Where,可以轻松组合成一个),每个表达式都被编译成一个委托。

代码行的计算方式如下:

static bool NotNullOrEmpty(string s) => !String.IsNullOrEmpty(s);
static string SelectSelf(string s) => s;
static bool StartsWithX(string s) => s.StartsWith("x");

public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values)
{
    var listX = values.Where(NotNullOrEmpty).Select(SelectSelf).Where(StartsWithX);
    return listX;
}

考虑

public static System.Collections.Generic.IEnumerable<string> Test(System.Collections.Generic.IList<string> values) {
    var listX = values.Where(x => { return !string.IsNullOrEmpty(x); }).Select(y => { return y; }).Where(w => { var xs = "x"; return w.StartsWith(xs); }); return listX; }

应该计算多少行代码?