jorge.armando
jorge.armando

Reputation: 50

How does VS Code metrics do the math

I've been digging around and I can't get an answer that convinced me. Until recently I thought that the number of lines of code depend only on the complete lines of code, I mean, every line of code with a real purpose which is more or less what MSDN says that the count is based on the IL code; but then I ran into a case like this ...

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

...where the counter of lines of code counts 6 diferent lines. Can some one tell me what's really going on, how is that IL interpreted linq queries as it makes 3 diferent lines of a single line of code; even more how can I explain that the use of linq brakes the rule of amount of lines per method? Thanks

Upvotes: 2

Views: 79

Answers (1)

NetMage
NetMage

Reputation: 26927

It appears the as part of using IL to approximate lines of codes, lambda expressions are counted as if they are separately defined methods.

Your sample LINQ query has 3 lambda expressions (one no effect Select and two Wheres that could be easily combined into one) each of which are compiled into a delegate.

The lines of code are counted as if written as follows:

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

Consider

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

How many lines of code should be counted?

Upvotes: 1

Related Questions