为什么C#比Java具有更多的功能?[关闭]


14

请注意,这并不意味着是Java vs. C#参数。我是一位没有C#经验的Java程序员,出于好奇而问。

我在C#上做了一些阅读,似乎它比Java具有更多的功能。一些例子:

  • 类型推断。
  • dynamic 关键词。
  • 代表们
  • 可选参数。
  • Lambda和LINQ (我实际上不知道它们是什么)。
  • 属性。

但是,Java实际上没有C#所没有的任何功能。

我的问题是:为什么C#比Java具有更多的本机功能?为何Java多年来一直没有添加其中的某些内容,例如Properties或type Inference?Java语言设计人员是否采用更简单的方法?这是什么原因呢?


2
@Patrick-这是功能-还是实现细节?
皮特2014年

14
偏颇的答案:因为C#设计团队知道他们在做什么。更为合理的答案:C#是在了解Java失败的情况下设计的,并且没有教条式的“仅纯OO”(它们甚至没有完全实现)。这些功能的一半是从Lisp和Haskell批量导入的,这两种语言在Java 8之前一直坚定地受到Java的启发,而其他一些功能则由于Java的缺乏而变得更加明显。
Phoshi 2014年

4
因为C#后来出现了,最初是Java的公然盗版,然后有机会添加了所有值得增加的东西,而Java却受到非常严格的向后兼容性目标的阻碍。
Kilian Foth,2014年

2
@ Clockwork-Muse,但是C#具有两个运行时实现-CLR和Mono。也有Xamarin。我还没有听说过使用Java构建跨iOS / Android / WinPhone项目的单一解决方案。
2014年

4
@KilianFoth:实际上,C#最初是Delphi的精打细算,被重写为Java。微软甚至挖走了Delphi项目设计师,使其脱离Borland进行创建。
梅森惠勒

Answers:


22

几个原因:

  1. C#比Java晚。版本1是对Java 1.4的公然剥夺,因此它具有Java在那时的所有功能。
  2. 但是后来C#的开发速度比Java快得多,因为它是一个令人兴奋的新平台(并且在Turbo Pascal的父亲Anders Hejlsberg中拥有非常出色的驱动程序)。这使他们避免了Java中所有显而易见的错误,同时增加了Java从业人员希望他们拥有的一切。
  3. 同时,Java受到非常严格的向后兼容性目标和较慢的开发速度的阻碍,部分原因是它不顾一切地试图以对95%的非天才人来说是标准,企业级,可靠,无意外的解决方案而赢得声誉程序员。在这一点上,他们取得了成功,也许有点太好了。

结果是Java现在有一些功能差距。它确实为未来制定了宏伟的计划,但是像往常一样,这种事情要花比计划更长的时间。


7
我不确定我是否同意这一点。我的意思是完全正确,但是我怀疑原因更多与围绕着太阳崩溃而来的政治有关。Java基本上有5年左右的时间,没有组织/领导层-因此没有新功能。
Telastyn 2014年

7
C#1具有值类型。Java永远不会拥有的东西。因此,不仅是“公然剥夺”。
2014年

1
@Telastyn-我认为这是这里最重要的一个原因。尤其是当您在Sun崩溃的末尾添加“然后被oracle收购”时。
Wyatt Barnett 2014年

7
同意@Den。我认为C#更快(正确的方向)发展的最大原因是Anders Hejlsberg的领导。他和他的团队添加了其他语言的最佳功能,并设法将它们无缝集成到C#中。结果是C#具有非常整洁的语言功能,而不会感到混乱或混乱。
David Kirkland 2014年

1
@WesleyWiser-升级为“将来可能有”。

4

我想补充一下Kilian的回答,Java和C#之间的一大区别是C#设计人员不仅控制语言,还控制标准IDE。

如果IDE无法正确支持扩展方法和部分类,则在开发/控件版本控制中可能会成为噩梦。

由于您可以使用自己选择的平台(Eclipse,Netbeans,vi + Ant)来编译Java,因此添加破坏代码的功能(并使用这些功能来开发LINQ等其他扩展)比说“由于IntelliSense将处理这些情况,因此我们不必担心”。

此外,有时值得注意功能的价值而不是数量。例如,自动属性很好,我当然希望Java支持这一点,但最后这仅意味着您必须用Java再写几行代码。同样,我发现调用“事件”功能有点用词不当,因为它们只不过是带有特殊标记的委托,而仅仅是Java已经使用的Observer模式的精炼副本(再次,在Java中,它需要更明确的表示)编码)

不要误会我的意思,我认为C#引入了一些值得注意的创新,我希望有一天Oracle大老板们醒来并推出真正的“ Java 2”以包括其中的一些,但是差距并不像您看到的那样明显。问题点。


2
一个简单的属性定义(声明+获取/设置+空格)所需的9行内容加起来很快就超过了“几行”。
凯文·克莱恩

@kevincline和我也正确记录 setter和getter。但是最后,即使我没有为访问器使用IDE自动代码生成功能,也没有在这些上花费任何可观的时间,因为您将时间花费在业务逻辑,测试和代码设计上(实际上即使输入访问器,我也大多在考虑这些。因此,虽然不错,但最终并不会带来很大的不同……
SJuan76

3
现在不是写它们的时候。现在是时候遍历有趣的部分,一遍又一遍地阅读和忽略它们了。
凯文·克莱恩

@kevincline我同意,这是绝对的可读性并且代码很干净。这就是为什么我看重“事件”之类的东西,它们只是内置的“观察者”模式,但是如果您必须自己编写,则可以使事情变得更加清晰
Aviv Cohn

@AvivCohn问题是,“内置”是关键部分。你可以有动态调度组装,你可以在C具有高阶函数,每一个语言功能,您可以可能的装配-很明显,因为在某些时候,它仍然是你的x86处理器上运行。您几乎不需要在C#中实现Command模式,因为您有委托。观察者和事件以及许多其他事件也是如此。Java拥有匿名方法已有一段时间了,但是您必须创建一个完整的匿名类型。这些东西很小,但它们加起来。
a安
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.