【问题标题】:How does VS Code metrics do the mathVS Code 指标是如何计算的
【发布时间】:2018-10-28 04:21:26
【问题描述】:

我一直在四处寻找,但无法得到令我信服的答案。直到最近我还认为代码行数只取决于完整的代码行,我的意思是,每一行代码都有一个真正的目的,这或多或少是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 会破坏每个方法的行数规则? 谢谢

【问题讨论】:

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


    【解决方案1】:

    作为使用 IL 来近似代码行的一部分,lambda 表达式被视为单独定义的方法。

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

    代码行数计算如下:

    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; }
    

    应该计算多少行代码?

    【讨论】:

    • 太好了,谢谢..“每个都被编译成一个委托”,这就是为什么!!。
    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2016-10-06
    • 2016-07-16
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    相关资源
    最近更新 更多