【问题标题】:Why use anonymous types instead of creating a class [duplicate]为什么使用匿名类型而不是创建类[重复]
【发布时间】:2014-01-30 05:44:47
【问题描述】:

我正在重构一个较旧的应用程序,它使用动态内联 SQL,从大型 Oracle 数据库中提取数据。我创建了一个运行良好的存储过程 (PL/SQL)。由于它只有一行(数据行),我让它返回一个数据行。此类驻留在 DAL 中。

当我重构事物时,我认为我会将数据库(在 DAL 中)与业务层(使用 linQ)隔离开来。我的第一个想法是创建一个对象来包含返回的数据行。

我的一位同事推荐了我不熟悉的匿名类型。在我到目前为止所做的阅读中,它看起来很简单。如果我仍然必须使用匿名类型放置字段名和字段类型,我只是看不到其中的值。

我错过了什么吗?如果我返回数据集/数据表,使用匿名类型会不会更有价值?

【问题讨论】:

  • 这是一个个案。如果需要在函数之间传递数据,则不能使用。
  • 感谢大家的回答。听起来匿名类型不是要走的路,我应该坚持使用一个类。

标签: c# linq anonymous-types


【解决方案1】:

匿名类型被设计为在创建它们的范围内使用。任何其他作用域都不应该知道该匿名类型的定义,因此由于您想从方法中返回此对象,因此匿名类型是不合适的。

一般来说,这个想法是对象只在一个或两个地方使用,都在同一个方法中,而且它的使用非常简单直接,不需要创建一个新的命名类型。它们也是不可变的,在 C# 中创建不可变对象...更冗长。

【讨论】:

【解决方案2】:

匿名类型非常适合一次性操作,但我不会将它们用作数据库实体的替代品。像这样使用它们真是一个糟糕的设计。

【讨论】:

    【解决方案3】:

    既然你不能返回匿名类型,你当然不应该使用 then 来表示域对象。它们的优势在于一次性使用的形式,通常在处理数据对象集合时在 lambda 表达式中。

    一个典型的例子是当您需要处理两个单独的集合时:您可以将zip them 一起处理,并将结果投影到只存在于 LINQ 查询范围内的匿名类型上。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多