【问题标题】:When and why use anonymous class instead of stucts for simple objects何时以及为什么使用匿名类而不是简单对象的结构
【发布时间】:2014-03-08 02:09:02
【问题描述】:

我在这个答案A generic list of anonymous class 中读到了如何加载带有匿名类对象的列表。我的问题是,考虑到性能和良好实践,为什么以及何时推荐使用这种方式而不是使用结构。

【问题讨论】:

标签: class struct c#-3.0 anonymous


【解决方案1】:

暴露场结构本质上是一组用胶带捆绑在一起的变量。它不会表现得像一个“对象”,因此可能会被视为邪恶,他们认为 一切 都应该表现得像一个对象;尽管如此,如果不是真的想要一个对象,而是一组用胶带绑定在一起的变量,暴露场结构可能是完美的选择。

与暴露字段结构相比,匿名类只有几个优点:

  • 声明它们的语法至少略小一些;根据编码标准,它可能会小很多。如果编码标准允许人们写internal struct WeightAndVolume { public double weight, volume;} 并说该结构是“不言自明的”[它包含两个double 类型的公共字段,名为weightvolume,每个字段都将包含任何内容最后由外部代码写入],匿名类不会节省太多,但如果编码标准要求每个命名数据类型都有很多页相关文档,包括对所需单元测试过程的分析,匿名类可以避免这样麻烦。
  • 复制类引用比复制大于 8 字节的结构稍微便宜一些,但除非引用被复制多次,否则创建对象的成本将超过复制所节省的成本。
  • 将匿名类转换为Object 比转换结构便宜很多。匿名类实例第一次被强制转换为 Object 将弥补创建它的额外成本。每增加一次,就可以节省该金额。
  • 将结构传递给泛型方法将需要 JITter 为该类型生成专用版本的代码;相比之下,JITter 只需生成一段代码即可处理所有匿名类。

一般来说,结构比匿名类更有效。另一方面,在某些情况下(主要与上述第三点有关),类最终会变得更好。

【讨论】:

  • 我同意 struct 不表现或不具备作为对象表现的所有必要条件,但是在 link 中提到了它“一个类或结构声明就像一个蓝图,它是用于在运行时创建实例或对象”。我确实很欣赏匿名类的细节,有很多我不知道的,它们在某些情况下似乎很方便,如上所述。
【解决方案2】:

我不会说曾经推荐使用匿名类,因为不使用它们永远不会错。但它们通常会在

  1. 这是一个一次性的工作,创建一个正确的命名类型会很麻烦,并且
  2. 对象的使用者要么是编译器生成的代码(您无权访问支持这些匿名类的类型,但编译器有)或使用反射(在这种情况下,您不需要访问这些类型在编译时)

发生这种情况的最常见情况是在 LINQ 查询中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 2020-11-23
    • 1970-01-01
    • 2023-03-15
    相关资源
    最近更新 更多