【发布时间】:2010-01-29 18:22:18
【问题描述】:
我是否应该密封所有我知道不应该用作基类的类,即使没有明显的性能或安全问题,或者这只是增加了麻烦?
【问题讨论】:
-
Somone said, and I read: 除非您知道您会遇到与客户的支持问题,否则不要永远密封课程。
标签: c# coding-style class sealed
我是否应该密封所有我知道不应该用作基类的类,即使没有明显的性能或安全问题,或者这只是增加了麻烦?
【问题讨论】:
标签: c# coding-style class sealed
可扩展的类实现了它可以扩展的特性——该特性与该类的任何其他特性一样,应该被视为一个特性,与方法没有区别。应仔细考虑所有功能,以确保它们满足使用该功能的客户的目标。需要设计、实施、审查安全问题、调试、记录和维护功能。
所有这些都需要付出努力,而努力通常需要花钱。你花谁的钱?他们可能对您是否应该使用此功能有意见。
基本上,您有三个选择:
1) 花钱做这个功能,这样您就可以确信它是正确、强大、安全并满足用户需求的。
2) 不执行上述任何操作,但仍要发布该功能,并希望发布具有未知安全风险的未经设计、快速实施、未经测试、未记录、未维护的功能不会伤害您、您的雇主或您的客户。
3) 封类。如果您发现 (1) 是正确的选择,请稍后打开它。
我说 (3) 物有所值。我总是密封我写的每一个不是为可扩展性而设计的类。
【讨论】:
将一个类设置为sealed 并不麻烦,因为这样做会在您的代码中设置一个严格的规则:这个类不能被继承。
只有在不必要且令人困惑的情况下,代码才会显得笨拙。
也就是说,一种思想流派(以及简单的经验法则)是您应该始终密封所有课程,因为在必要时很容易解封它们,但反之则不然。一些代码生成器会自动执行此操作。 (参见上面 Eric Lippert 的选项 #3。它基本上说的是同一件事。)
【讨论】:
我根本不会认为它添加了垃圾。相反,你清楚地表达了你对课程的意图。
类应该被设计为继承或被密封。不幸的是,类在 C# 中默认情况下不是密封的,因此您必须自己包含关键字。就个人而言,我更喜欢一个关键字来显式地使类可用于继承,因为这将阻止人们将类用作基类,除非它被显式标记为这样。
【讨论】:
是的。如果不出意外,这只是一个路标,让其他人知道他们不应该走得更远。
【讨论】: