在查看history of C#时,我发现C#被视为对C和/或C ++的更新。这对我来说有点意外,表面上看,我看到C#和Java之间有更多常见的想法(想到垃圾收集)。我不是用Java编写代码,但是我通常没有问题遵循Java代码,并经常阅读有关Java中我可以在C#中轻松转置的模式的书籍,并且老实说不能对C ++说同样的内容。
所以我的问题是,C#如何更接近C ++而不是Java?这只是拒绝承认Java,还是我错过或误解了什么?
答案 0 :(得分:51)
它的名字以字母C开头。
答案 1 :(得分:33)
C#的语法仅在某些领域更接近C ++:指针操作(Java没有),派生声明(即public class Foo : Bar, IBaz
而不是public class Foo extends Bar implements IBaz
)和运算符重载。
其他一切都像Java(在类声明中声明的静态main,没有头文件,单继承,许多其他),就像Java和C ++(基本语法),或唯一的C#(属性,委托,许多)很多其他的)。
答案 2 :(得分:16)
我认为从某种意义上说,C#更像是一种多范式语言,而不是像JAVA那样强迫单一范式(OOP)。实际上这是一件好事,因为它为程序员提供了更多的自由。
答案 3 :(得分:12)
如果你还记得这段历史,那么微软实际上会尝试在Java上使用他们的“拥抱和扩展”方法来添加它,这样它只能用于Windows并称之为“J ++”。
太阳起诉他们所以他们出来了J#,它非常接近Java作为一个止损,让他们有时间开发自己的语言(C#)。在那时,它是当时所有语言中最好的概念的混合 - 说它更多地基于一个而不是另一个,它实际上没有意义,它只是一个集合的选定的功能。
但是,如果您喜欢从头开始并使用迄今为止所有语言的最佳功能的想法,请务必检查Scala - 它已经超越了Java或C#可以做的事情,即使有一个主要功能革命。
答案 4 :(得分:8)
受C ++启发的语法,受Java启发的VM和库(在.net 1.1中)几乎与Delphi库的1-1相关。
答案 5 :(得分:7)
我认为Java - > C#连接比C ++强得多 - > C#,主要是因为,正如已经指出的那样,C#是Sun诉讼对MSVM涉嫌违反Java规范的结果。特别是J ++使用了额外的关键字/功能,如'委托',这成为了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必须是最重要的。
在很多方面,你可以看看微软改进的Java版本,J ++为C#0.1
答案 6 :(得分:5)
就我个人而言,我会说它比C ++更接近Java,但是对于大熔炉来说还有一些额外的东西:
所有3的泛型都不同,但Java的类型擦除泛型可能(尽管这是一个奇怪的比较),比C#基于C#运行时的泛型更接近C ++模板。
答案 7 :(得分:5)
首先,它允许指针操作(在不安全的块中)。
答案 8 :(得分:4)
好吧,我想你会对此发起一些争论。
我认为Java也是C ++的一种更新/演变,所以这当然会在一定程度上解释相似性。事实上,C#受到Java和C ++的启发,并从两种语言中获取概念。当然,功能编程和动态编程领域有很多适应C#。
所以我认为说C#比Java更“接近”而不是C ++或者反之亦然。它在某种程度上接近两者。
答案 9 :(得分:3)
我接受过一次采访,问我C#的语言是什么样的,我很快就说了一个更好的C ++或Java(C--)。面试官说“错了!”,这是德尔福。我不知道德尔福,所以......
答案 10 :(得分:2)
在OO和继承方面,C#更类似于C ++。例如:
class MyClass : MyInterface
而不是
class MyClass implements MyInterface
和
public MyClass() : base()
而不是
public MyClass() { super(); }
C#也使用虚函数的思想来允许重载。在java中,继承和重载更像是一个必须被锁定的开放事务。在C ++和C#中,它默认情况下更加锁定,必须打开。
其他相似之处包括:
答案 11 :(得分:2)
这是营销。微软当然不想承认“嘿,我们正在制作Java 1.1!” 首先,它与承认Java实际上值得复制是一样的,如果你想要击败Java,这是一个不好的举动。
其次,它会吓跑所有被Java笨拙和早期性能问题吓跑的本地C ++开发人员。
所以他们说他们在C ++上建立起来,每个人都更开心。
实际上,当然,事实并非如此。
如果C#和Java有一个共同的祖先,它不是C ++,而是“C with classes”;特别是,最早的C ++版本,早在它标准化之前,并且在大多数使它变得有用之前今天已被添加。
这只不过是试图将一些OOP功能强加到C上。
从那时起,C ++走向了一个完全不同的方向,放弃了OOP的痴迷,并探索了更多功能的风格,使用编译时的鸭子打字形式来创建泛型编程。该语言中添加了一些非常强大和优雅的库。这些都不是在或 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 ++一样的共同祖先。
答案 12 :(得分:1)
FWIW:从历史角度来看,现有的C#出现在现场,MSFT正在推广Visual J ++,它是Java的一种实现,具有一些增强功能,可以利用Windows特定的功能。
Sun Microsystems起诉他们的目标是使用Java编写曾经运行过的语言,而Visual J ++会导致应用程序只能在Windows上运行,而不能在Sun的Unix实现上运行。
Sun在法庭上胜诉,MSFT从市场上撤回了Visual J ++,不久之后宣布了Visual C#,它在语法上和功能上完全不同于刚刚撤回的Visual J ++语言。
答案 13 :(得分:1)
值得的是,C#的Forms与Java Swing密切相关。在大多数情况下,C ++ Gui库非常不同。
答案 14 :(得分:1)
一个例子是字符串上的比较运算符==。 C#采用C ++方法并对字符串进行词法比较。 Java比较字符串引用。
这是一个很好的MSDN article,它将引导您对C#和Java以及C#和C ++进行比较。
答案 15 :(得分:1)
我可能会对此采取措施,但是,C#基本上是微软对Java的回答。它是一种语言,可以扩展任何他们选择的方式(与Java不同,他们因未经批准的方式进行扩展而受到指责)。它具有Java的关键特性:内存管理和大型系统库。它本身就像C ++一样或C语言,以引诱那些不是Java粉丝的C ++和C开发人员。
答案 16 :(得分:0)
我将C#视为C ++的托管版本,而不是重写Java。在创建这样一种语言时,它自然采用Java(语法)的形式,但保留了令人难以置信的强大C ++的元素。
答案 17 :(得分:0)
这三个人都是近亲 谁的母亲是小屁股。
每种语言的父亲是另一个问题?
Ada + Smalltalk => Java
C + Smalltalk => C++
? + Smalltalk => C#