【问题标题】:Why is the 'System.Version' a reference type (class) and not a value type (struct)?为什么“System.Version”是引用类型(类)而不是值类型(结构)?
【发布时间】:2011-12-06 11:05:28
【问题描述】:

如果我查看 .NET 类型 System.Version 的成员,创建值类型(C# 结构)而不是引用类型(类)可能是一个更好的主意。

Microsoft 决定以这种方式实现该类型的原因或论据可能是什么?它只是一种“错误”/错误/无关紧要还是“功能”(换句话说:“真正想要和有用的”?

有像 Parse()TryParse() 这样的方法,它们是典型的值类型,例如System.Int32System.DoubleSystem.GuidSystem.Version 的属性仅存储短值和整数值(s.System.TimeSpan),类型本身是可比较的(使用运算符),并且作为结构,可能不需要使其可克隆。

我对“现状”没有任何反对意见,只是为了满足我的好奇心;-)

编辑:添加了对System.TimeSpan的比较。

【问题讨论】:

  • 既然这些类型不是必须的结构,那么问题是没有意义的。
  • 没错,但我很想知道做出这个决定的原因是什么
  • @Andrey - 似乎是一个合理的问题,因为Version 看起来是值类型的完美选择。
  • 为什么重要?如果它是一个结构,它实际上会改变你的任何编码吗?
  • 我能想到的真正原因只有一个:结构不能有默认构造函数。版本 0.0.0.0 是有效版本。如果它是一个结构,那么它将需要一个额外的“版本已正确初始化且有效”标志。

标签: .net types reference system.version


【解决方案1】:

根据 Microsoft 的own guidelines,当实例至少为 16 字节时,您应该更喜欢类而不是结构。由于System.Version 存储了四个 Int32,每个由四个字节组成,总共 16 个字节,因此他们按照自己的建议将其设为一个类。

【讨论】:

  • System.DateTime 是什么? System.Int32 值的属性超过 4 个。
  • @Marcel DateTime 有一个 64 位整数字段。所以总共只有 8 个字节。属性的数量无关紧要。
  • @MarcelJ.Kloubert:DateTime 是一个 8 字节的结构。远低于 16 字节截止值。
  • 啊,好的。它根据内部刻度值计算其他属性,例如 Minutes 或 Seconds...
  • 我觉得今天(2021 年)使用 16 字节作为分水岭是不合时宜的,因为 x64 是标准,并且大多数(如果不是全部?)处理器都可以在 very 上运行多亏了 AVX 等,长字长有效,而且 128 位或 256 位内存总线宽度也很常见 - 当然重要的是基准测试,但我可以编写或使用 4 个或更多的结构 @987654324 @成员,当然。想想 C# 7.3 中的 ValueTuple - 您可以轻松地最终得到一个长度超过 64 字节 的结构,而不会出现任何问题。
【解决方案2】:

与设计过程相关的另一点是Version 是 ComVisible。

因此,将其作为 coclass(行为,不保证内部布局)而不是 COM 结构(指定内存中的布局,如 C 结构)更有意义。

【讨论】:

    【解决方案3】:

    我不能肯定地说,但一个原因可能是不变性。 Version 类中的属性都是只读的。虽然可以在结构中声明 readonly 字段,但 Eric Lippert 指出 readonly on a struct field is a lie

    将其设为类可确保不变性。

    【讨论】:

    • 根据微软的guidlines,你应该只定义一个不可变的结构。所以微软会遵循相反的逻辑似乎很奇怪,结构应该用于可变类型,只是因为编译器不能保证不变性。
    猜你喜欢
    • 2011-01-25
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多