【问题标题】:Why are some classes in the CLR sealed?为什么 CLR 中的某些类是密封的?
【发布时间】:2017-09-23 20:00:54
【问题描述】:

我最近一直在使用System.Version class 并且想知道为什么它以及其他一些类似的足够简单的类被标记为Sealed(VB 中的NotInheritable)。

与一些更复杂的类不同,我看不出这样的类通过被密封会获得什么。

据我所知,sourceVersion 没有任何暗示。

这是否有已发布/官方(即不基于意见)的原因?是否有一些问题可能是由它派生而来的?专门针对 Version 的情况,或者对于类似的简单类而言失败。

背景:我不得不重新创建Version 类,以便更轻松地使用双向绑定,因为MS 版本具有ReadOnly 属性。但我需要知道派生是否会导致一些问题

【问题讨论】:

  • 这个答案够stackoverflow.com/a/7777674/920557 吗?见[2]部分
  • @EugeneKomisarenko 谢谢,有点。第 1 部分很清楚为什么 应用程序 程序员可以封装一个类(与 CLR 程序员相反)。第 2 部分提供的信息听起来合乎逻辑,但基于异端说法,考虑到 MS 基类的存在是为了节省我们的工作,而不是强迫我们复制它,因此没有多大意义。如果可能的话,我更喜欢更具体的来源/原因。
  • 我相信设计是为了继承或禁止它。设计继承需要一些工作,并且通常会进一步限制实现。考虑到这一点,类应该是密封的或设计为能够继承它们。如果你有一个你无法控制的基类的实现怎么办?密封类可防止您无法控制且不打算被继承的基类问题。
  • 供将来参考,@TnTinMn 链接到的页面的 cmets 中提到的 Ingo Rammer 文章可在此处的 Internet 存档中找到 web.archive.org/web/20061110133859/http://www.thinktecture.com/…

标签: .net vb.net sealed


【解决方案1】:

Version 是一个表示“值”的类,类似于DateTime,但太大而无法舒适地放入struct,它是class。不过,同样的设计原则也适用。表示值的类型应该是不可变的和密封的(值类型总是密封的)。

您还可以清楚地看到价值观的其他特征:

  • object.Equalsobject.GetHashCode 已被覆盖。
  • 它实现了IEquatable<Version>

【讨论】:

  • 当结构“太大”时,是否有规则或经验法则?来自 C 背景,我通常喜欢将我的结构仅用于字段;如果他们需要功能,那就是一类。
  • @Toby,有关一般指南,请参阅:Choosing Between Class and Struct
  • 供我以后参考,在这种特定情况下,我的“BetterVersion”类可能实际上应该包装 CLR Version 类,而不是从它继承(“is-a”关系),由它组成(“有”关系)或复制它。
猜你喜欢
  • 2014-12-27
  • 1970-01-01
  • 2010-12-18
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多