C# 然后用它们构建一个语法树。然后,您可以在此树中搜索类型为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# 然后用它们构建一个语法树。然后,您可以在此树中搜索类型为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#,.net,anonymous-types,C#,.net,Anonymous Types,但是上面的代码有一个小问题,那就是它可能会根据您的视角给出误报。例如,考虑以下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

但是上面的代码有一个小问题,那就是它可能会根据您的视角给出误报。例如,考虑以下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");
由于上述代码中的两个匿名类型具有相同的属性,并且在同一个程序集中声明,因此编译器。我上面的代码示例将为这段代码返回2,我认为这应该是1

通过检查匿名类型并忽略相等的类型(与已发现的匿名类型具有相同类型的相同属性名),可以轻松克服此限制。不幸的是,目前版本的Roslyn CTP似乎没有。我试过了,但是从类型初始值设定项中得到的表达式的语义信息是
,而对于实际的匿名类型,它是
null

这是一个好的指标吗? 在我看来不是。与程序员工具箱中的其他内容一样,在适当的情况下使用它们非常有用,简单的计数(甚至与命名类进行比较)几乎什么都不会告诉您

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

过于简单的措施会产生过于简单的(误导性的)结果

据说数量本身就有质量。旧苏联和萨达姆喜欢这个指标,但历史表明,这是一个糟糕的结果指标

正确的软件度量从目标开始。如果目标是愚弄管理者,使其认为自己在管理软件质量,那么SLOC(软件代码行)、匿名方法计数等就可以了。他们听起来很酷,并且得出了截然不同的结论——“你永远不会出错!”。但不幸的是,拥有如此无知的软件团队

获取测量工具,并接受适当的使用培训


一个简单的链接:是一种流行的方法。

简单化的度量会产生简单化的(误导性的)结果

据说数量本身就有质量。旧苏联和萨达姆喜欢这个指标,但历史表明,这是一个糟糕的结果指标

正确的软件度量从目标开始。如果目标是愚弄管理者,使其认为自己在管理软件质量,那么SLOC(软件代码行)、匿名方法计数等就可以了。他们听起来很酷,并且得出了截然不同的结论——“你永远不会出错!”。但不幸的是,拥有如此无知的软件团队

获取测量工具,并接受适当的使用培训


通用链接:是一种流行的方法。

你所说的“代码库”是什么意思?这是源代码文件的集合还是已编译的二进制文件的集合?或者我可以同时使用它们吗?欢迎您使用其中一个(或两个)。您所说的“代码库”是什么意思?这是源代码文件的集合还是已编译的二进制文件的集合?或者我可以同时使用它们吗?欢迎您使用其中一个(或两个)。为此,我刚刚试用了您的代码,我发现用CompilerGeneratedAttribute标记的类型的名称类似于c_uDisplayClass1B。在我试用的代码库中,我发现89/159(55%)的类型是匿名的。这似乎是相当高的“否”类型,名称以
c\uu DisplayClass
开头,它们不是匿名类型,它们是闭包类型,闭包的实现细节。为此,我刚刚试用了您的代码,我发现用CompilerGeneratedAttribute标记的类型的名称类似于c\uu displayclassb。在我试用的代码库中,我找到了89/159(55%)的类型是匿名的。这似乎相当高。名称以
c\uu DisplayClass
开头的“否”类型不是匿名类型,它们是闭包类型,闭包的实现细节。编写
Where()
的另一种方法是
of type()
。编写
Where()的另一种方法
将是()类型的
// 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");