代码之家  ›  专栏  ›  技术社区  ›  Cherian

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

  •  3
  • Cherian  · 技术社区  · 15 年前

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

    <%=Html.TextBox("view.Address", "address", new { Class = "text_field" })%>
    

    许多操作的返回类型都有:

    JsonNetResult jsonNetResult = new JsonNetResult
    {
      Formatting = Formatting.Indented,
      Data = new {Something= “”}
    }
    

    from p in context.Data
    select new { p.Name, p.Age };
    

    在LINQ之外,这些真的是完成事情的正确方法吗?它们会损害代码的可重用性和可读性吗?

    5 回复  |  直到 15 年前
        1
  •  5
  •   GEOCHET S.Lott    15 年前

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

    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" });
    

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

        2
  •  3
  •   tvanfosson    15 年前

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

        3
  •  1
  •   user83286 user83286    15 年前

        4
  •  0
  •   Lennaert    15 年前

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

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

        5
  •  0
  •   Romano Zumbé Ajay Jain    7 年前

    我同意