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

有帮助吗?

解决方案

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

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

例如:

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 的实际应用(第 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)

这可以防止你进行丑陋的反射编程。

@沃特:

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

其中 ID 和 NAME 是 Person 类的真实财产。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top