何时以及为何使用匿名类而不是stucts用于简单对象

时间:2014-03-07 14:20:56

标签: class struct c#-3.0 anonymous

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

2 个答案:

答案 0 :(得分:0)

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

时使用
  1. 这是一次性的工作,为此创建一个合适的命名类型将是麻烦的,
  2. 对象的使用者是编译器生成的代码(您无权访问支持这些匿名类的类型,但编译器可以访问)或使用反射(在这种情况下,您不需要访问类型在编译时)
  3. 最常见的情况是LINQ查询。

答案 1 :(得分:0)

外露场结构本质上是一组用胶带绑定在一起的变量。它不会表现为“对象”,因此可能会被视为邪恶,认为所有应该像对象一样行事;尽管如此,如果一个人并不真正想要一个对象,而是一组用胶带捆绑在一起的变量,那么暴露场结构可能是完美的选择。

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

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

通常,结构比匿名类更有效。另一方面,有一些场景(主要与上面的第三点相关),其中类最终会更好。