我看过很多关于匿名类型如何工作的描述,但我不确定它们如何真正有用。在精心设计的程序中可以使用匿名类型来解决哪些场景?
7 回答
匿名类型与系统设计甚至类级别无关。它们是开发人员在编码时使用的工具。
我什至不将匿名类型视为类型本身。我主要将它们用作方法级匿名元组。如果我查询数据库然后操作结果,我宁愿创建一个匿名类型并使用它,而不是声明一个在我的方法范围之外永远不会使用或知道的全新类型。
例如:
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 in action(第 76 页第 2.6.3 节):
...匿名类型 [是] 快速简单的临时结果的好工具。由于临时类型,我们不需要声明类来保存临时结果。
基本上它们对于暂时在本地范围内保存信息很有用。任何更多的事情都需要使用反射,并且可能会成为一个很大的问题。他们在上面引用的书中给出的示例是以书面形式来控制每个正在运行的进程所占用的 id、名称和内存量。他们创建一个匿名类型,将它添加到一个列表(所有一个语句),然后使用 ObjectDumper 输出它。因此,代码不再需要一个单独声明的类来保存所使用的 id、名称和内存,而是隐式声明了所有代码,从而将行数减少到 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);
匿名类型最流行的用途是在 LINQ to SQL 查询中指定投影。
这个查询
from x in db.Table1 select new {x.Column1, Alias2=x.Column2}
将转换为以下 SQL:
SELECT Column1, Column2 AS Alias2 FROM Table1
使用匿名类型,您可以创建临时投影,而无需事先为其定义类型。编译器将为您定义类型。
当您为“使用和抛出”目的创建类型时。这似乎是由于LINQ。似乎是一种为 LINQ 查询动态创建具有字段的结构的方法。仅返回具有指定字段的结构/类型。如果不是这样,您必须为您希望检索的每个唯一字段组合声明一个 .Net 类型。
将它们与 Linq 一起使用。
重要的是要知道,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 和 NAME 是您的 Person 类的真实属性。