Visual Studio代码度量标准错误地报告了代码行

Ian*_*son 7 lines-of-code out code-metrics visual-studio

Visual Studio中的代码度量分析器以及代码度量电源工具,TestMethod将以下代码方法中的代码行数报告为8.

最多,我希望它报告代码行为3.

[TestClass]
public class UnitTest1
{
    private void Test(out string str)
    {
        str = null;
    }

    [TestMethod]
    public void TestMethod()
    {
        var mock = new Mock<UnitTest1>();

        string str;
        mock.Verify(m => m.Test(out str));
    }
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样吗?

更多信息

经过一番挖掘后,我发现out从Test方法中删除参数并更新测试代码会导致LOC被报告为2,我认为这是正确的.添加out会导致跳转,因此不是因为大括号或属性.

用dotPeek反编译DLL会显示相当多的额外代码,因为out参数可以被认为是8 LOC,但删除参数和反编译也会显示生成的代码,可以认为是5 LOC,所以它不仅仅是VS的问题计算编译器生成的代码(我不相信它应该做什么).

Rob*_*yth 2

“代码行”(LOC) 有几种常见的定义。每个人都试图为我认为几乎毫无意义的指标带来一些意义。例如谷歌有效代码行(eLOC)。

我认为 VS 将属性作为方法声明的一部分包含在内,并试图通过计算语句甚至大括号来给出 eLOC。一种可能性是“m => m.Test(out str)”被计为一条语句。

考虑一下:

if (a > 1 &&
    b > 2)
{
   var result;
   result = GetAValue();
   return result;
}
Run Code Online (Sandbox Code Playgroud)

和这个:

if (a> 1 && b >2)
   return GetAValue();
Run Code Online (Sandbox Code Playgroud)

LOC 的一种定义是计算包含任何代码的行数。这甚至可能包括大括号。在如此极端简单的定义中,计数因编码风格而异。

eLOC 试图减少或消除代码风格的影响。例如,正如这里的情况,声明可以被算作“行”。没有论证,只是解释。

考虑一下:

int varA = 0;
varA = GetAValue();
Run Code Online (Sandbox Code Playgroud)

和这个:

var varA = GetAValue();
Run Code Online (Sandbox Code Playgroud)

两行还是一行?

这一切都取决于意图是什么。如果要测量您需要多高的显示器,那么也许可以使用一个简单的 LOC。如果目的是衡量复杂性,那么计算代码语句(例如 eLOC)可能会更好。

如果您想测量复杂性,请使用复杂性度量,例如圈复杂度。不要担心 VS 如何测量 LOC,因为我认为,无论如何,它都是一个无用的指标。