计算代码库中的匿名类?

时间:2012-01-04 10:56:34

标签: c# .net anonymous-types

我知道有一些工具可以计算我在代码库中使用的类的数量,这是一个合理的软件工程指标(例如每个类的平均代码行数)。

但是我想知道是否有任何工具来计算代码库中匿名类的数量?

如果是这样,这会产生一个有趣的软件质量指标吗?例如我可能会担心,如果我有比正常班级更多的匿名课程,虽然我不确定我是否应该。

4 个答案:

答案 0 :(得分:4)

我不认为匿名类型的数量是一个有用的指标,无论是单独使用还是与命名类型的数量进行比较。我也不知道有任何衡量这一点的工具(但这并不意味着它们不存在)。

要查找已编译程序集中的匿名类型的数量,您可以使用有关已编译的匿名类型的这些事实:

  1. 他们拥有[CompilerGenerated]属性
  2. 他们的名字以<>f__AnonymousType(C#中无法形容的名字)开头。
  3. 他们的[DebuggerDisplay]属性为Type="<Anonymous Type>"
  4. #1本身不足以识别匿名类型。我认为你不能依赖#2或#3,因为MS可以随时决定改变它们,其他编译器,如Mono C#,可以使用另一种风格。但我认为这是你能做的最好的事情。使用#1和#2,您可以编写一个方法来执行您想要的操作:

    private static int ComputeNumberOfAnonymousTypes(Assembly assembly)
    {
        return (from type in assembly.GetTypes()
                where Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute))
                        && type.Name.StartsWith("<>f__AnonymousType")
                select type)
            .Count();
    }
    

    如果你想知道一堆源代码文件中的匿名文件数量,你需要C#解析器。如果您愿意使用预发布软件,我认为这对Roslyn来说是一个很好的工作,除了它不支持匿名类型。

答案 1 :(得分:2)

我知道你要求一个工具来做这个,但我认为这是一个尝试新Roslyn CTP的有趣机会,它应该能够很好地解决这些问题。

实际上,很容易掌握创建匿名类型的所有地方。只需解析源代码文件并从中构建语法树。然后,您可以在此树中搜索类型为AnonymousObjectCreationExpression的节点,如下所示:

private static int GetNumberOfAnonymousObjectCreations(string filename)
{
    var tree = SyntaxTree.ParseCompilationUnit(
                             File.ReadAllText(filename));
    return tree.Root.DescendentNodes()
               .Where(n => n.Kind == SyntaxKind.AnonymousObjectCreationExpression)
               .Count();
}

上述代码虽然存在一个小问题,但根据您的观点,它可能会给您误报。例如,考虑以下C#文件作为输入:

// Part of ToParse.cs
var range = Enumerable.Range(1, 100);
var foo = range.Select(i => new { Value = i });
var bar = range.Select(i => new { Value = i });
// This comparison is legal because the compiler considers the 
// two anonymous types to be the same
if (foo.First() == bar.First())
    Console.WriteLine("Equal");
else
    Console.WriteLine("Not Equal");

由于上面代码中的两个匿名类型具有相同的属性并在同一个程序集中声明,因此编译器considers them to be of the same type。我上面的代码示例将为此代码返回2,在我看来应该只是1.

通过检查匿名类型并忽略相同的类型(与已发现的匿名类型相同的属性名称),可以轻松克服此限制。不幸的是,当前版本的Roslyn CTP似乎不是support that。我尝试了但是我为类型初始值设定项中的表达式返回的语义信息是<Error>,对于实际的匿名类型,它是null

这是一个好的指标吗?

在我看来,事实并非如此。与程序员工具箱中的其他所有内容一样,它们在适当的环境下使用时非常有用,并且简单的计数(甚至与命名类的比较)几乎不会告诉您什么。

事实上,只有一种方法可以衡量代码质量: The only valid measurement of code quality

答案 2 :(得分:0)

它会制作一个有趣的软件质量指标吗?可能不是。这取决于组织尝试使用指标完成的工作。如果组织认为匿名类是有问题的,那么测量它们的频率会很有趣。

答案 3 :(得分:0)

简单的措施会产生简单化(读取误导性)的结果。

据说数量具有所有自己的品质。旧苏联和萨达姆喜欢这个指标,但历史证明它是一个糟糕的结果指标。

正确的软件测量从目标开始。如果目标是欺骗经理认为他正在管理软件质量,那么SLOC(软件代码行),匿名方法计数等都可以。它们听起来很酷,并且得出了截然不同的结论 - “你永远不会出错!”。但是,有可能会因为这样一个无知的软件团队而感到沮丧。

获取测量工具并对其进行适当的培训。

一个有趣的链接:Cyclomatic Complexity是一种流行的方法。