VS Code 指标如何计算

How does VS Code metrics do the math

我一直在四处挖掘,但找不到令我信服的答案。直到最近我还认为代码行数只取决于完整的代码行数,我的意思是,每一行代码都有真正的目的,这或多或少是 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;
}

...其中代码行计数器计数 6 个不同的行。有人能告诉我到底发生了什么吗,IL 是如何解释 linq 查询的,因为它在一行代码中生成了 3 行不同的代码;更重要的是,我该如何解释 linq 的使用打破了每个方法的行数规则? 谢谢

似乎作为使用 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; }

应该统计多少行代码?