C# 在LINQ之外使用匿名类型是件好事吗?

C# 在LINQ之外使用匿名类型是件好事吗?,c#,.net,linq,C#,.net,Linq,在分析一些ASP.NETMVC项目时,我看到了分散在各地的匿名类型 HTML帮助程序具有以下功能: <%=Html.TextBox("view.Address", "address", new { Class = "text_field" })%> JsonNetResult jsonNetResult = new JsonNetResult { Formatting = Formatting.Indented, Data = new {Something= “”} }

在分析一些ASP.NETMVC项目时,我看到了分散在各地的匿名类型

HTML帮助程序具有以下功能:

<%=Html.TextBox("view.Address", "address", new { Class = "text_field" })%>
JsonNetResult jsonNetResult = new JsonNetResult
{
  Formatting = Formatting.Indented,
  Data = new {Something= “”}
}
我知道这来自LINQ:

from p in context.Data
select new { p.Name, p.Age };
在LINQ之外,这些真的是完成事情的正确方法吗?它们会损害代码的可重用性和可读性吗?

我同意


与传递lambda和委托相同,我认为它们是构建词典的更好方法,而不是寻找连贯的域级摘要。特别是在你的样品中,有什么选择?通过词典?我认为匿名类型更具可读性。

IMHO,匿名类型最大的问题源于无法命名其类型。也就是说,不可能明确地将匿名类型的类型指定为代码中的表达式。这使得创建一个通用列表这样的事情变得很尴尬

var list = New List<No way to specify an Ananymous type>();
var list=newlist();
通常,您必须求助于助手方法

public List<T> CreateList<T>(T notUsed) {
  return new List<T>();
}
var list = CreateList(new { .Class = "foo" });
公共列表CreateList(T未使用){
返回新列表();
}
var list=CreateList(new{.Class=“foo”});
这也有更大的影响,因为您不能使用匿名类型作为返回类型,使强制转换非常尴尬(需要一个助手方法),等等

但匿名类型并不是为这些操作而设计的。在许多方面,它们被设计用于特定定义的函数中,并随后创建lambda表达式。不作为一种数据通信类型,用于连接到成熟的功能。这当然是设计上的一个限制,有时会让我抓狂。但总的来说,我发现它们是语言中非常有用的结构


LINQ的许多部分都不可能以某种形式没有它们

当创建的对象是临时对象时,即它立即被消费或转换为其他对象,我喜欢匿名类型的想法。它可以防止您在代码中乱扔单一用途的类,这些类的唯一用途是作为短期容器。您的示例是使用它的典型类型,即在helper扩展中,它几乎总是立即转换为参数字典,并使用json结果进行序列化。如果该类具有域重要性或需要用作一级对象,请务必为其创建一个域类。

我定期使用它们填充GridView和DataGridView,因为将GridView配置为仅显示我感兴趣的列可以节省大量时间


但是,除了设置数据源之外,我认为这对可读性不利——一个好的抽象可能更好。

这是相当主观的,有争议,你能重写或编辑吗,不太像一个巨魔,包括你自己的理由/顾虑。投票决定以主观/辩论的方式结束,因为OP没有提供他火焰背后的实际理由。编辑很好,Rich现在我们有一个问题我同意Josh-如果这真的结束,我会投票重新开始。好的,现在更好,如果完全模糊。如果你能给他们一个名字,那么他们就不会是匿名的:)换一种方式考虑,真正的问题是语言要求我们声明一个类型,即使可以推断类型。我宁愿使用(new[]{new{Class=“foo”},new{Class=“bar”})。ToList()@jachymko,尽管这样做有创建数组以创建列表的开销。“不是很大的开销,但仍然是。”丹尼尔,没错。问题是C#中添加了类型推断,因此有很多限制。如果你看看像F#这样的语言,类型推理从第一天开始就出现在设计中,你会发现类型推理的级别有很大的不同。你是说所有的委托传递都是不好的,还是说你看到它被滥用了?我看到它被使用得太多了-它为程序员打开了一个懒惰的短期选择,特别是在扩展现有代码的场景中。我要说的是,在编码方面,几乎没有绝对性;)