为什么C#和Java要求所有东西都在一个类中?

好像以前应该问过这个问题,但搜索一无所获。

我一直想知道让我们把所有代码放在类或接口中的重点是什么。 我似乎记得要求像C这样的main()函数有一些优点,但对于类没什么。 从某种程度上说,像Python这样的语言比Java更加面向对象,因为它们没有原语,但你可以将代码放在任何你想要的地方。

这是对OOP的某种“误解”吗? 毕竟,您可以像在C中一样编写过程代码并将其放在类中,但它不是面向对象的。

我认为要求所有内容都包含在类中的目标是最大限度地减少语言中需要处理的概念的数量 。 在C#或Java中,您只需要了解对象模型(尽管这很复杂)。 但是,您只有包含成员和类(对象)实例的类。

我认为这是一个非常重要的目标,大多数语言试图以这种或那种方式遵循。 如果C#有一些全局代码(例如,允许交互式评估和没有Main方法的启动代码规范),那么你需要学习一个额外的概念(顶级代码)。 C#/ Java的选择当然只是获得简单性的一种方式。

当然,这是一个问题,这是否是正确的选择。 例如:

  • 在函数式语言中,程序使用类型 (类型声明)和表达式进行结构化。 程序的主体只是一个被评估的表达式,它比使用Main方法的类简单得多,并且它还支持交互式脚本(如在Python中)。

  • 在Erlang(和类似语言)中,程序被构造为同时执行的进程,其中一个主进程启动其他进程。 这是一种截然不同的方法,但它对某些类型的应用程序很有意义。

一般来说,每种语言都有某种方式来观察世界并对其进行建模,并在查看所有内容时使用这种观点。 这在某些情况下效果很好,但我认为这些模型都不是完全通用的。 这可能是混合多种范式的语言在今天非常流行的原因。

作为旁注,我认为使用Main方法有点争论(可能inheritance自C / C ++语言)。 我认为更明确的面向对象的解决方案是通过创建一些Main类的实例来启动程序。

C#不是为“小编程”而设计的。 相反,它是为面向组件的编程而设计的 。 也就是说,对于编程场景,人们正在开发相互依赖的软件组件,这些组件将随着时间的推移以多个版本发布。

强调大规模编程并远离小编程意味着有时围绕小程序会有很多“仪式”。 使用这个,主要是等等等等等等,所有人都写“你好世界”。

属性“一行程序是一行长”在C#中会很好。 我们正在考虑允许在小型程序中的类之外的代码作为假设的未来版本的C#中的可能特征; 如果您对此类function有建设性意见,请随时通过我博客上的联系链接发送给我。

我认为Java的想法是顶层类代表一个代码单元,它将被编译为一个单独的.class文件。 这个想法是,这些独立的,独立的代码单元可以很容易地分享并组合成许多项目(就像木匠可以结合基本部件,如螺母,螺栓,木块等,以制作各种物品)。 这个类被认为是最小的,最基本的primefaces单元,因此一切都应该是一个类的一部分,以便更容易从这些部分组装更大的程序。

可以说,面向对象编程对易于组合的代码的承诺并没有很好地解决,但是在设计Java时,OOP的目标是创建很少的单元(类),可以很容易地组合起来制作独特的程序。

我想C#有一些相同的目标。