首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在代码库中计算匿名类?

在代码库中计算匿名类?
EN

Stack Overflow用户
提问于 2012-01-04 18:56:34
回答 4查看 408关注 0票数 1

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

然而,我想知道是否有任何工具可以计算代码库中匿名类的数量?

如果是这样的话,这会成为一个有趣的软件质量指标吗?例如,如果我的匿名类比普通类多,我可能会担心,尽管我不确定我是否应该这样做。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-04 19:54:49

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

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

attribute

  • Their名称以[CompilerGenerated]开头( <>f__AnonymousType在C#中是一个难以说出的名称),

  • 具有

  • 属性[DebuggerDisplay]

#1本身不足以标识匿名类型。我认为你不能依赖#2或#3,因为微软可以在任何时候决定更改它们,而其他编译器,如Mono C#,可以使用另一种风格。但我觉得这是你能做的最好的了。使用#1和#2,您可以像这样编写一个执行您想要的操作的方法:

代码语言:javascript
复制
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来说是一个很好的工作,除了它还不支持匿名类型。

票数 4
EN

Stack Overflow用户

发布于 2012-01-04 21:38:49

我知道你想要一个工具来做这件事,但我认为这是一个有趣的机会来尝试新的Roslyn CTP,它应该可以很好地解决这类问题。

事实上,获取创建匿名类型的所有位置非常容易。只需解析源代码文件并在其中构建语法树即可。然后,您可以在此树中搜索类型为AnonymousObjectCreationExpression的节点,如下所示:

代码语言:javascript
复制
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#文件作为输入:

代码语言:javascript
复制
// 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。

通过检查匿名类型并忽略相等的类型(与已发现的匿名类型具有相同类型的相同属性名),很容易克服此限制。不幸的是,当前版本的罗斯林CTP似乎没有support that。我试过了,但我为类型初始化器中的表达式返回的语义信息是<Error>,而对于实际的匿名类型,它是null

这是一个好的指标吗?

在我看来并非如此,就像程序员工具箱中的其他东西一样,它们在正确的环境下使用时非常有用,简单的计数(甚至与命名类进行比较)几乎不会告诉你任何事情。

事实上,衡量代码质量的方法只有一种:

票数 2
EN

Stack Overflow用户

发布于 2012-01-04 19:56:44

它会成为一个有趣的软件质量指标吗?可能不会。这取决于组织试图通过指标实现的目标。如果组织认为匿名类有问题,那么测量它们的频率将是很有趣的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8725656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档