为什么方法在 Java 中是虚拟的,而在 C# 中是默认的非虚拟的?[已关闭]

2022-09-02 14:26:05

在Java中,默认情况下,方法是虚拟的;C# 恰恰相反。

哪个更好?每种方法的优缺点是什么?


答案 1

Anders Hejlsberg:(C# 首席架构师)

有几个原因。一个是性能。我们可以观察到,当人们用Java编写代码时,他们忘记了将他们的方法标记为最终结果。因此,这些方法是虚拟的。因为它们是虚拟的,所以它们的性能并不好。只有与虚拟方法相关的性能开销。这是一个问题。

一个更重要的问题是版本控制。关于虚拟方法有两种思想流派。学术思想流派说:“一切都应该是虚拟的,因为我可能有一天想推翻它。务实的思想流派来自构建在现实世界中运行的真实应用程序,它说:“我们必须非常小心我们所做的虚拟。

当我们在一个平台上制作虚拟的东西时,我们就对它未来的发展方式做出了很多承诺。对于非虚拟方法,我们保证当您调用此方法时,x 和 y 将发生。当我们在API中发布虚拟方法时,我们不仅承诺当您调用此方法时,x和y会发生。我们还承诺,当您重写此方法时,我们将针对其他方法以此特定顺序调用它,并且状态将处于此不变和该不变状态。

每次在 API 中说 virtual 时,都是在创建一个回调挂钩。作为操作系统或API框架设计师,您必须对此非常小心。您不希望用户在API中的任何任意点覆盖和挂钩,因为您不一定能做出这些承诺。当人们做虚拟的东西时,他们可能并不完全理解他们所做的承诺。


答案 2

Java的方式更简单,默认情况下,C#的方式更精细,更安全,更高效。哪个更好是在啤酒持有人的眼中。