如何计算C#解决方案中的代码行数,没有注释和空行,以及其他冗余的东西等?

时间:2011-05-10 20:31:38

标签: c# .net linq

冗余的东西,我的意思是命名空间,因为我知道它们是必要的,但是如果它们有10k,它就不会向表中添加有价值的信息。

可以使用Linq完成吗?

6 个答案:

答案 0 :(得分:26)

无需重新发明轮子。看看Visual Studio Code Metrics PowerTool 11.0

  

概述

     

代码指标PowerTool是一个命令行实用程序,可计算托管代码的代码度量标准并将其保存到XML文件中。该工具使团队能够在构建过程中收集和报告代码度量标准。计算的代码指标是:

     

•可维护性指数

     

•Cyclomatic Complexity

     

•继承深度

     

•类耦合

     

•代码行(LOC)

我知道你说你没有Ultimate,所以我只想告诉你你缺少的东西。

Code Metrics in VS 2010 Ultimate

对于其他人,有SourceMonitor Source Monitor

答案 1 :(得分:21)

Visual Studio将为您完成此操作。右键单击您的项目,然后选择Calculate Code Metrics

答案 2 :(得分:2)

来自:http://rajputyh.blogspot.in/2014/02/counting-number-of-real-lines-in-your-c.html

private int CountNumberOfLinesInCSFilesOfDirectory(string dirPath)
{
    FileInfo[] csFiles = new DirectoryInfo(dirPath.Trim())
                                .GetFiles("*.cs", SearchOption.AllDirectories);

    int totalNumberOfLines = 0;
    Parallel.ForEach(csFiles, fo =>
    {
        Interlocked.Add(ref totalNumberOfLines, CountNumberOfLine(fo));
    });
    return totalNumberOfLines;
}

private int CountNumberOfLine(Object tc)
{
    FileInfo fo = (FileInfo)tc;
    int count = 0;
    int inComment = 0;
    using (StreamReader sr = fo.OpenText())
    {
        string line;
        while ((line = sr.ReadLine()) != null)
        {
            if (IsRealCode(line.Trim(), ref inComment))
                count++;
        }
    }
    return count;
}

private bool IsRealCode(string trimmed, ref int inComment)
{
    if (trimmed.StartsWith("/*") && trimmed.EndsWith("*/"))
        return false;
    else if (trimmed.StartsWith("/*"))
    {
        inComment++;
        return false;
    }
    else if (trimmed.EndsWith("*/"))
    {
        inComment--;
        return false;
    }

    return
           inComment == 0
        && !trimmed.StartsWith("//")
        && (trimmed.StartsWith("if")
            || trimmed.StartsWith("else if")
            || trimmed.StartsWith("using (")
            || trimmed.StartsWith("else  if")
            || trimmed.Contains(";")
            || trimmed.StartsWith("public") //method signature
            || trimmed.StartsWith("private") //method signature
            || trimmed.StartsWith("protected") //method signature
            );
}
  1. 忽略//和/ * kind的注释。
  2. 以多行书写的声明被视为单行。
  3. 括号(即' {')不被视为行。
  4. '使用命名空间'行被忽略。
  5. 忽略类名等的行。

答案 3 :(得分:1)

我对它们一无所知,但您可以使用Code Metrics Values获取有关您的解决方案的一些统计信息,例如代码行。

答案 4 :(得分:1)

我们使用tfs多维数据集来获取有关在tfs上添加/删除/更改行数的数据。这个你可以从excel查看。但需要正确配置它。而且我认为它不会排除评论和空白行等。

答案 5 :(得分:0)

Ctrl + Shift + f(在文件中查找) - > put";"在"找到什么:" -textbox - >按"查找全部" - 按钮。

这个极其简单的方法利用了这样一个事实,即任何C#语句都以分号结束。而且,至少我不会在任何其他地方使用分号(例如在评论中)......