C# 匿名类型应该如何在C中使用?

C# 匿名类型应该如何在C中使用?,c#,anonymous-types,C#,Anonymous Types,我看过很多关于匿名类型如何工作的描述,但我不确定它们是否真的有用。在设计良好的程序中,匿名类型可以用来解决哪些场景?当您创建用于“使用和抛出”目的的类型时。 这似乎是林克的功劳。似乎是一种为LINQ查询动态创建具有字段的结构的方法。仅返回具有指定字段的结构/类型。如果不是这样,您必须为要检索的每个字段的唯一组合声明.Net类型。来自LINQ in action第76页第2.6.3节: 。。。匿名类型[是]一个快速简单的临时结果的好工具。由于临时类型,我们不需要声明类来保存临时结果 基本上,它们可

我看过很多关于匿名类型如何工作的描述,但我不确定它们是否真的有用。在设计良好的程序中,匿名类型可以用来解决哪些场景?

当您创建用于“使用和抛出”目的的类型时。
这似乎是林克的功劳。似乎是一种为LINQ查询动态创建具有字段的结构的方法。仅返回具有指定字段的结构/类型。如果不是这样,您必须为要检索的每个字段的唯一组合声明.Net类型。

来自LINQ in action第76页第2.6.3节:

。。。匿名类型[是]一个快速简单的临时结果的好工具。由于临时类型,我们不需要声明类来保存临时结果

基本上,它们可以暂时将信息保存在本地范围内。任何更多的东西都需要使用反射,这可能会成为一个相当大的问题。他们在上面引用的书中给出的示例是以书面形式来控制台id、名称和每个正在运行的进程占用的内存量。他们创建一个匿名类型,将其添加到一个所有语句的列表中,然后使用ObjectDumper将其输出。因此,代码不再需要单独声明的类来保存所使用的id、名称和内存,而是隐式地声明它的all,从而将行计数减少到4:

var pl = new List<Object>();
foreach(var p in Process.GetProcesses())
  pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64});
ObjectDumper.Write(pl);

匿名类型与系统设计无关,甚至与类级别无关。它们是开发人员在编码时使用的工具

我甚至不把匿名类型当作类型本身。我主要将它们用作方法级匿名元组。如果我查询数据库,然后操纵结果,我宁愿创建一个匿名类型并使用它,也不愿声明一个在我的方法范围之外永远不会使用或知道的全新类型

例如:

var query = from item in database.Items
            // ...
            select new { Id = item.Id, Name = item.Name };

return query.ToDictionary(item => item.Id, item => item.Name);

没有人关心a,匿名类型。它在那里,因此您不必声明另一个类。

将它们与Linq一起使用。

匿名类型最常用的用法是在Linq到SQL查询中指定投影

这个问题

from x in db.Table1 select new {x.Column1, Alias2=x.Column2}
将转换为此SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1

使用匿名类型,您可以创建临时投影,而无需事先为其定义类型。编译器将为您定义类型。

重要的是要知道,LINQ不会强迫您使用匿名类型。也可以在选择后编写普通对象构造

var query = from item in database.Items
// ...
select new Person(item.id, item.Name)
这可以防止您进行丑陋的反射编程。

@Wouter:

var query = from item in database.Items
select new Person
{
ID =item.id,
NAME= item.Name
};

其中ID和名称是Person类的不动产。

您是否需要这些。当然,如果您在方法中所做的太多,以至于它保证了匿名类型,那么您应该重构该方法。在你的例子中,你查询数据库,然后修改结果,…这对我来说是两个不同的方法。我不是在修改结果,而是将它们转换成更容易返回的其他形式。应该注意不要在多个方法上过度分发代码,因为这会使代码完全无法读取和创建,因为无法使用匿名类型,许多丑陋的代码或冗余的手动编码类型。这不是匿名类型这是使用对象初始值设定项而不是匿名类型