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;
}
...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
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 Where
s 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?