当C#类的方法默认为非虚拟时,为什么默认情况下未密封C#类?

时间:2019-05-06 14:39:53

标签: c# class-visibility

默认情况下,C#中的方法是非虚拟的。 This answer to another question解释了这样做的好处:

  

应该为继承设计类,以便能够利用它。默认情况下,将方法虚拟化意味着该类中的每个函数都可以插入并替换为另一个函数,这并不是一件好事。

甚至Anders Hejlsberg seems to give the same reason

  

当我们在API中发布虚拟方法时,我们不仅承诺在调用此方法时还会发生x和y。我们还承诺,当您重写此方法时,相对于其他方法,我们将以特定的顺序调用它,并且状态将处于此不变状态。 [...]您不希望用户在API中的任意点上重写和挂接,因为您不一定会做出这些承诺。

我同意这种推理:通常,当我创建一个非私有方法时,我只想创建可以从类外部的某个地方调用的代码。通常,不考虑其他人如何覆盖此方法以及将产生何种效果。对于特殊情况,我可以使用virtual来表示 did 以一种有意义的方式创建代码。

但是,默认情况下仍未打开类。 default 假定我花了额外的精力来确保继承一个类是合理的。

在这方面,是否有任何使类不同于方法的东西?


编辑
我真的不知道关于搁置-基于观点的的更改。我从没问过意见。也许我必须明确地说出来?

我不想要意见。

正确的答案要么是提供与方法不同的类的示例,要么是指出在这种情况下没有区别。

1 个答案:

答案 0 :(得分:8)

我相信问题是“鉴于有充分的理由说明为什么方法默认情况下应该是非虚拟的,为什么类也不默认情况下也是密封的?”

还可以添加:C#将默认可访问性设置为内部(对于顶级类型)或私有(对于类型的成员);也就是说,它选择了更严格和更安全的选择;如果开发人员希望使用限制性较小,危险性更高的选项,则可以选择采用。默认情况下,密封也将选择限制性更强,更安全的选项作为默认选项。

也:开封课程绝不是一项重大更改,但稍后确定您希望将某个班级密封起来,将其密封是一项重大更改。 C#通常更喜欢鼓励较少改动的设计选择,因此出于这个原因,您还认为C#类应默认为密封。

我们已经确定了默认情况下密封的既是一个好主意又与C#中其他设计选择保持一致的三个原因。那么为什么C#在这方面会不一致,选择将未密封的类设置为默认类?

我不知道。作为C#中的次要设计缺陷,它总是令我感到震惊。对于这种选择,我从未见过有力的论据,也不知道是否在早期的设计会议上进行了辩论。那是我在设计团队之前的时间。

除非您遇到2001年参加该设计会议的人并询问他们,否则您对问题的答案可能不会令人满意。

除非有理由为继承而设计它,否则我习惯于封闭我编写的每个类。我鼓励大家也这样做。