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

时间:2009-03-27 14:10:30

标签: c# .net linq

在分析一些ASP.NET MVC项目时,我看到了遍布各地的匿名类型。

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之外完成任务的正确方法?它们是否会损害代码的可重用性和可读性?

5 个答案:

答案 0 :(得分:5)

恕我直言,匿名类型的最大问题源于无法命名他们的类型。也就是说,不可能在代码中将匿名类型的类型明确指定为表达式。这实际上很难做出像创建通用List这样的事情。

var list = New List<No way to specify an Ananymous type>();

通常你必须求助于辅助方法。

public List<T> CreateList<T>(T notUsed) {
  return new List<T>();
}
var list = CreateList(new { .Class = "foo" });

这也有一个更大的影响,因为你不能使用匿名类型作为返回类型,使得转换非常笨拙(需要帮助方法)等...

但这些并不是Anonymous Types的设计目的。在许多方面,它们被设计为在特定的定义函数中使用,并且随后创建lambda表达式。不是完全成熟的功能之间的数据通信类型。这肯定是设计的限制,有时会让我感到沮丧。但总的来说,我发现它们是语言中非常有用的结构。

如果没有它们,LINQ的许多部分都是不可能的。

答案 1 :(得分:3)

当正在创建的对象是暂时性对象时,即它立即被消耗或转换为其他东西时,我喜欢匿名类型的想法。它可以防止您使用仅用作短期容器的单用途类来乱丢您的代码。您的示例是典型的使用类型,它们派上用场,即在帮助程序扩展中,它几乎总是立即转换为参数字典,并且json结果会被序列化。如果类具有域重要性或需要用作第一类对象,那么无论如何都要为它创建一个域类。

答案 2 :(得分:1)

我认为它们是构建字典的更好方法。特别是在你的样品中,有什么替代品?传递IDictionary&lt; String,Object&gt;?我认为匿名类型更具可读性。

答案 3 :(得分:0)

我同意

同样传递lambda和委托,而不是找到连贯的域级别的abstrations

答案 4 :(得分:0)

我经常使用它们来填充GridViews和DataGridViews,因为它节省了大量时间配置GridView以仅显示我感兴趣的列。

然而,除了设置DataSources之外,我认为它对可读性有害 - 好的抽象可能更好。