在查看C# 的历史时,我发现 C# 被视为 C 和/或 C++ 的更新。这让我有点吃惊,因为从表面上看,我看到了 C# 和 Java 之间更常见的想法(我想到了垃圾收集)。我不会用 Java 编写代码,但我通常可以毫无问题地遵循 Java 代码,并且经常阅读有关 Java 模式的书籍,这些书籍我可以很容易地用 C# 转换,而且老实说,我对 C++ 的看法也不尽相同。
所以我的问题是,C# 如何更接近 C++ 而不是 Java?这仅仅是拒绝承认 Java,还是我错过或误解了什么?
18 回答
它的名字以字母 C 开头。
IMO,C# 比 Java 更多地受 C++ 启发的想法只是营销;试图以 Java 无法做到的方式将顽固的 C++ 程序员带入托管世界。C#主要来源于Java;任何回顾历史的人,尤其是 90 年代中期 Sun 和 Microsoft 之间的 Java VM 战争,都可以看出 Java 是主要的父级。
C# 的语法仅在某些方面更接近 C++:指针操作(Java 没有)、派生声明(即,public class Foo : Bar, IBaz
而不是public class Foo extends Bar implements IBaz
)和运算符重载。
其他一切要么就像 Java(在类声明中声明的静态 main,没有头文件,单一继承,许多其他),就像 Java 和 C++(基本语法),或者独特的 C#(属性,委托,许多其他) .
我认为 C# 更像是一种多范式语言,而不是像 JAVA 那样强制使用单一范式(OOP)。这实际上是一件好事,因为它为程序员提供了更多的自由。
如果您还记得历史,微软实际上曾尝试在 Java 上使用他们的“拥抱和扩展”方法,并在其中添加了它,以便它只适用于 Windows,并将其称为“J++”。
Sun 起诉了他们,因此他们推出了与 Java 非常接近的 J#,作为权宜之计,让他们有时间开发自己的语言 (C#)。
那时,它是当时所有可用语言中最好的概念的混合——说它更多地基于一种而不是另一种并没有真正的意义,它只是选定特性的集合。
但是,如果您喜欢这种从头开始并使用迄今为止语言的所有最佳特性的想法,请务必检查一下 Scala——它已经远远超出了 Java 或 C# 的能力,即使发生了重大的特性革命。
受 C++ 启发的语法、受 Java 启发的 VM 和库(在 .net 1.1 中)与 Delphi 库几乎是 1-1 相关的。
我认为 Java -> C# 连接比 C++ -> C# 强得多,主要是因为,正如已经指出的那样,C# 是 Sun 对 MSVM 涉嫌违反 Java 规范的诉讼的结果。特别是 J++ 使用了额外的关键字/功能,如“delegate”,这成为 C# 的主要区别特征之一,这是 Sun 的主要抱怨之一。
其他函数,如 @dll 和 @com 指令(在 Java 和 C# 中都预先定义了属性)也是投诉的一部分。请注意 C# 的 COM PIA 指令与 J++ 中的 @com 指令之间的相似性。将 J++ 的 JDirect 与 C# 中的本机互操作进行比较。(诉讼的另一个原因是 MS 完全禁用了 Java 的 JNI 以支持特定于 Windows 的 JDirect。)
最后,Anders Hejlsberg 是负责 J++ 和 C# 的人,因此 Java/J++ 和 C# 之间的联系非常牢固。毫无疑问,Hejlsberg 具有 C++ 思维的许多方面(特别是方法指针/委托特性,他首先在 J++ 中提出了这一点),但可以肯定地说 Java 必须处于最前沿。
在许多方面,您可以将 Microsoft 的 Java 更改版本、J++ 视为 C# 0.1
就个人而言,我会说它比 C++ 更接近 Java,但还有一些额外的熔炉:
- 委托(大致是函数指针)
- 用户定义的值类型
泛型对于所有 3 种都不同,但 Java 的类型擦除泛型可能(尽管这是一个奇怪的比较)比基于 C# 运行时的泛型更接近 C++ 模板。
对于初学者,它允许指针操作(在不安全的块中)。
好吧,我想你会就此开始争论。
我认为 Java 也是 C++ 的一种更新/演变,所以这当然会在一定程度上解释相似之处。事实当然是 C# 受到 Java 和 C++ 的启发,并从这两种语言中提取了概念。当然,在函数式编程和动态编程领域有很多东西正在适应 C#。
所以我认为说 C# 比 C++ 更接近于 Java 或相反是错误的。它在某种程度上接近两者。
有一次面试问我 C# 是以什么语言为模型的,我很快说更好的 C++ 或 Java (C--)。面试官说“错!”,是德尔福。我不知道德尔福,所以...
在 OO 和继承方面,C# 更类似于 C++。例如:
class MyClass : MyInterface
代替
class MyClass implements MyInterface
和
public MyClass() : base()
代替
public MyClass() { super(); }
C# 也使用虚函数的思想来允许重载。在java中,继承和重载更像是一个必须锁定的公开事务。在 C++ 和 C# 中,默认情况下它更加锁定,并且必须打开。
其他相似之处包括:
- 通过引用传递
- 运算符重载
- 函数指针/委托
是营销。微软当然不想承认“嘿,我们正在开发 Java 1.1!” 首先,这与承认 Java 实际上值得复制是一样的,如果你想击败 Java,这是一个糟糕的举动。
其次,它会吓跑所有被 Java 的笨拙和早期性能问题吓跑的本地 C++ 开发人员。
所以他们说他们建立在 C++ 之上,每个人都更快乐。
当然,在现实中,没有什么比事实更离谱的了。
如果 C# 和 Java 有共同的祖先,那就不是 C++,而是“C with classes”;具体来说,最早的 C++ 版本,早在它被标准化之前,并且在大多数使它今天有用的东西被添加之前。
这只不过是尝试将一些 OOP 功能固定到 C 中。
从那时起,C++ 就朝着完全不同的方向发展,放弃了对 OOP 的痴迷,探索了一种功能更强大的风格,使用鸭子类型的编译时形式来创建泛型编程。该语言中添加了一些非常强大和优雅的库。这些都没有在 Java或C# 中表示。
C# 绝对是受 Java 启发的最重要的东西。它的灵感来自于 C++,它的灵感来自于早期的“C with classes”变体,而不是任何类似于现代 C++ 的东西。
但是 C++ 曾经并且现在被许多人认为是一种“酷”的语言。微软希望利用这种“酷”并将其引入 .NET。
就个人而言,我认为 C++、C# 和 Java 是兄弟姐妹。它们都源自相同的“C with classes”原型语言。C# 和 Java 从那里采取的路线不如 C++ 直接,但它仍然是他们大部分灵感的来源。这就是他们继承了 OOP 的奇怪概念的地方,这与 Alan Kay/Smalltalk 提出的几乎没有任何关系,而且他们继承了笨拙的类似 C 的语法。
这有点像说我们人类是从猿进化而来的。不是。我们只是有一个共同的祖先,而那个共同的祖先有点像猿。C# 不是从 C++ 派生的,它们只是有一个有点像 C++ 的共同祖先。
一个例子是字符串上的比较运算符 ==。C# 采用 C++ 方法并对字符串进行词法比较。Java 比较字符串引用。
这是一篇很好的MSDN 文章,带您了解 C# 和 Java 以及 C# 和 C++ 之间的比较。
我可能会对此感到不满,但是是的,C# 基本上是微软对 Java 的回答。它是一种他们可以以任何他们选择的方式扩展的语言(与 Java 不同,Java 因以未经批准的方式扩展它而受到谴责)。它具有 Java 的关键特性:内存管理和大型系统库。它尽可能多地类似于 C++ 或 C,以吸引尚未成为 Java 粉丝的 C++ 和 C 开发人员。
值得一提的是,C# 的表单与 Java 的 Swing 密切相关。C++ 的 Gui 库在大多数情况下是完全不同的。
FWIW:从历史的角度来看,在 C# 出现之前,MSFT 正在推广 Visual J++,它是 Java 的一种实现,具有一些增强功能,可以利用 Windows 特定的功能。
Sun Microsystems 起诉,因为他们使用 Java 的目标是编写一次可在任何地方运行的语言,而 Visual J++ 将导致应用程序只能在 Windows 上运行,而不能在 Sun 的 Unix 实现上运行。
Sun 在法庭上胜诉,MSFT 将 Visual J++ 从市场上撤下,不久之后宣布 Visual C# 在语法和功能上与刚刚撤消的 Visual J++ 语言略有不同。
三人只是近亲。
谁的妈妈是闲聊。
谁是每种语言之父是另一个问题?
Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#
我将 C# 视为 C++ 的托管版本,而不是 Java 的重写。在创建这样一种语言时,它自然采用了 Java 的形式(在语法上),但保留了功能强大的 C++ 的元素。