【问题标题】:When and why use anonymous class instead of stucts for simple objects何时以及为什么使用匿名类而不是简单对象的结构
【发布时间】:2014-03-08 02:09:02
【问题描述】:
【问题讨论】:
标签:
class
struct
c#-3.0
anonymous
【解决方案1】:
暴露场结构本质上是一组用胶带捆绑在一起的变量。它不会表现得像一个“对象”,因此可能会被视为邪恶,他们认为 一切 都应该表现得像一个对象;尽管如此,如果不是真的想要一个对象,而是一组用胶带绑定在一起的变量,暴露场结构可能是完美的选择。
与暴露字段结构相比,匿名类只有几个优点:
- 声明它们的语法至少略小一些;根据编码标准,它可能会小很多。如果编码标准允许人们写
internal struct WeightAndVolume { public double weight, volume;} 并说该结构是“不言自明的”[它包含两个double 类型的公共字段,名为weight 和volume,每个字段都将包含任何内容最后由外部代码写入],匿名类不会节省太多,但如果编码标准要求每个命名数据类型都有很多页相关文档,包括对所需单元测试过程的分析,匿名类可以避免这样麻烦。
- 复制类引用比复制大于 8 字节的结构稍微便宜一些,但除非引用被复制多次,否则创建对象的成本将超过复制所节省的成本。
- 将匿名类转换为
Object 比转换结构便宜很多。匿名类实例第一次被强制转换为 Object 将弥补创建它的额外成本。每增加一次,就可以节省该金额。
- 将结构传递给泛型方法将需要 JITter 为该类型生成专用版本的代码;相比之下,JITter 只需生成一段代码即可处理所有匿名类。
一般来说,结构比匿名类更有效。另一方面,在某些情况下(主要与上述第三点有关),类最终会变得更好。
【讨论】:
-
我同意 struct 不表现或不具备作为对象表现的所有必要条件,但是在 link 中提到了它“一个类或结构声明就像一个蓝图,它是用于在运行时创建实例或对象”。我确实很欣赏匿名类的细节,有很多我不知道的,它们在某些情况下似乎很方便,如上所述。
【解决方案2】:
我不会说曾经推荐使用匿名类,因为不使用它们永远不会错。但它们通常会在
- 这是一个一次性的工作,创建一个正确的命名类型会很麻烦,并且
- 对象的使用者要么是编译器生成的代码(您无权访问支持这些匿名类的类型,但编译器有)或使用反射(在这种情况下,您不需要访问这些类型在编译时)
发生这种情况的最常见情况是在 LINQ 查询中。