Как метрики VS Code выполняют математику - PullRequest
0 голосов
/ 17 мая 2018

Я копался и не могу получить ответ, который убедил меня.До недавнего времени я думал, что количество строк кода зависит только от полных строк кода, я имею в виду каждую строку кода с реальной целью, которая более или менее соответствует тому, что 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 голосов
/ 18 мая 2018

Похоже, как часть использования IL для аппроксимации строк кода, лямбда-выражения учитываются, как если бы они были отдельными методами.

Ваш пример запроса LINQ содержит 3 лямбда-выражения (одно без эффекта 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; }

Сколько строк кода должно быть подсчитано?

...