2017-04-26 53 views
2

我最近一直在使用System.Versionclass并且想知道为什么它和其他一些类似简单的类被标记为SealedNotInheritable在VB中)。为什么CLR中的某些类被密封?

与一些更复杂的课程不同,我没有看到这样的课程通过密封会获得什么。

据我可以告诉sourceVersion并不意味着任何理由。

是否有已发布/官方(即不是基于意见)的原因?是否有可能由此导致的一些问题?特别是对于Version的情况,或者对于类似简单的类别,则不合格。

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

+1

请问这个问题的答案足够http://stackoverflow.com/a/7777674/920557?请参阅[2]部分 –

+0

@EugeneKomisarenko谢谢,有点。第1部分对于为什么一个*应用程序*程序员可以封闭一个类而言是显而易见的(与CLR程序员相反)。第二部分给出的信息听起来合乎逻辑,但基于异端,并没有多大意义,因为MS基础类是为了拯救我们的工作,而不是强迫我们复制它。如果可能的话,我更喜欢更具体的来源/原因。 – Toby

+0

我相信在设计继承或禁止它。设计继承需要一些工作,并且通常会进一步限制实现。考虑到这一点,类应该被密封或设计为能够继承它们。如果你有一个你无法控制的基类实现呢?一个密封的类可以防止你无法控制的基类问题,并且不打算继承。 – Codexer

回答

1

Version是表示“价值”一类,类似DateTime,但过大舒适融入一个struct,它的class。但是,相同的设计原则适用。表示值的类型应该是不可变的和密封的(值类型总是被密封的)。

您也可以清楚地看到价值的其他特点:

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

当结构“太大”时,是否有规则或经验法则?来自C背景我*一般*喜欢保持我的结构只为田野;如果他们需要功能,那么这是一个类。 – Toby

+2

@Toby,有关一般准则,请参见:[在类和结构之间选择](https://msdn.microsoft.com/en-us/library/ms229017(v = vs.110).aspx)。 – TnTinMn

+0

对于我未来的参考,在这种特定的情况下,我的“BetterVersion”类应该实际上*包装CLR Version类而不是从它继承(“is-a”关系),由它组成(“has-a”关系)或再现它。 – Toby

相关问题