|
1
109
类应该为继承而设计,或者禁止继承。为继承而进行设计是有代价的:
Effective Java的第17项对此进行了更详细的介绍——无论它是在Java的上下文中编写的,这个建议都适用于。NET也是。 就我个人而言,我希望类在默认情况下是密封的。网。 |
|
|
2
42
此主题的MSDN文章是 Limiting Extensibility by Sealing Classes . |
|
|
3
15
看来 official Microsoft guidelines on sealing 自从大约9年前提出这个问题以来,他们已经从选择加入的理念(默认密封)转变为选择退出(默认不密封):
事实上,如果你
search the ASP.Net Core codebase
,你只会发现大约30次
我确实认为不变性守恒是支持密封的一个很好的论据。 |
|
|
4
4
我在msdn文档中发现了这句话:“密封类主要用于防止派生。因为它们永远不能用作基类,一些运行时优化可以使调用密封类成员稍微快一些。” 我不知道性能是否是密封类的唯一优势,就我个人而言,我还想知道其他原因。.. |
|
|
5
3
性能是一个重要因素,例如,java中的字符串类是final(<-sealed),其原因仅在于性能。 我认为另一个重要的一点是避免这里详细描述的脆弱基类问题: http://blogs.msdn.com/ericlippert/archive/2004/01/07/virtual-methods-and-brittle-base-classes.aspx 如果你提供了一个框架,那么对于可维护性遗留项目来说,升级你的框架以避免脆弱的基类问题非常重要 |
|
|
6
1
密封用于防止“脆性基层问题”。我找到了一个 good article MSDN对此进行了解释。 |
|
|
7
0
密封允许您实现一些微小的性能提升。在JIT和懒惰悲观主义的世界里,这不如在C++的世界里那么真实,但从那时起。NET并不像java编译器那样悲观,主要是因为不同的设计理念,它仍然有用。它告诉编译器,它可以直接调用任何虚拟方法,而不是通过vtable间接调用它们。 当你想要一个“封闭的世界”来进行平等比较时,这一点也很重要。通常,一旦我定义了一个虚拟方法,我就非常需要定义一个真正实现这个想法的等式比较概念。另一方面,我可能能够使用virtual方法为类的特定子类定义它。密封该类可确保平等真正成立。 |
|
|
8
0
密封类使管理可支配资源更容易。 |
|
|
9
0
要确定是否密封类、方法或属性,通常应考虑以下两点: 通过自定义类的能力,派生类可能会获得潜在的好处。 派生类可能会修改你的类,使它们不再正常工作或按预期工作。 |
|
|
10
0
另一个需要考虑的因素是,密封类不能在单元测试中被删除。来自 Microsoft's documentation :
|
|
Sweepy Dodo · JSON lite的格式化 1 年前 |
|
|
giantjenga · 优化整数向量到二进制向量的转换 1 年前 |
|
Zegarek · Postgresql递归查询未提供预期结果 1 年前 |
|
|
Joe · 为什么这两个查询之间的性能存在如此大的差异? 2 年前 |
|
tic-toc-choc · 在`dplyr中高效使用列表进行过滤` 2 年前 |