C#和Java之间的主要区别是什么?


209

我只想澄清一件事。这不是哪个更好的问题,我将这一部分留给其他人讨论。我不在乎。在工作面试中有人问我这个问题,我认为学到更多可能会有用。

这些是我能想到的:

  • Java是“平台无关的”。如今,您可以说存在Mono项目,因此也可以考虑使用C#,但我认为这有点夸张。为什么?好了,当新发行的Java完成后,它同时可在其支持的所有平台上使用,另一方面,Mono实现中仍缺少多少C#3.0功能?还是我们应该在这里比较的是CLR vs. JRE
  • Java不支持事件和委托。我所知道的。
  • 在Java中,所有方法都是虚拟的
  • 开发工具:我相信还没有像Visual Studio这样的工具。尤其是如果您使用过团队版本,您将了解我的意思。

请添加您认为相关的其他人。

更新:我突然想到,Java在类,方法等上没有自定义属性,是吗?


1
语言与语言实现不同,语言实现也​​与库不同。您想比较什么?
Miguel Ping


2
我发现了一个msdn.microsoft.com/zh-cn/library/ms836794.aspx,它涵盖了C#和Java之间的相似之处和不同之处。
Bipul 2010年

1
您可以使用正确的库获得以下有关Java的许多内容。例如,检查以下有效的Java代码:new String [] {“ james”,“ john”,“ john”,“ eddie”} .where(startsWith(“ j”))。distinct(); 它使用一个名为lombok-pg的库。可以在github.com/nicholas22/jpropel找到
NT_

Answers:


329

比较Java 7和C#3

(此处未提及Java 7的某些功能,但using已删除了所有C#版本相对于Java 1-6 的声明优势。)

并非所有摘要都是正确的:

  • 在Java中,默认情况下方法是虚拟的但您可以将它们定型。(在C#中,默认情况下将它们密封,但是您可以将它们设置为虚拟。)
  • 有很多针对Java的IDE,包括免费的(例如Eclipse,Netbeans)和商业的(例如IntelliJ IDEA)

除此之外(还有您的摘要中的内容):

  • 两者之间的泛型完全不同。Java泛型只是一个编译时的“技巧”(但在那时很有用)。在C#和.NET中,泛型也将在执行时进行维护,并适用于值类型和引用类型,并保持适当的效率(例如List<byte>byte[]后盾,而不是盒装字节数组)。
  • C#没有检查异常
  • Java不允许创建用户定义的值类型
  • Java没有运算符和转换重载
  • Java没有用于简单实现迭代器的迭代器块
  • Java没有像LINQ这样的东西
  • 部分由于没有委托,Java没有像匿名方法和lambda表达式那样的东西。匿名内部类通常扮演这些角色,但是笨拙。
  • Java没有表达式树
  • C#没有匿名内部类
  • 实际上,C#根本没有Java的内部类-C#中的所有嵌套类都类似于Java的静态嵌套类
  • Java没有静态类(没有任何实例构造函数,并且不能用于变量,参数等)
  • Java没有等效于C#3.0匿名类型的任何东西
  • Java没有隐式键入的局部变量
  • Java没有扩展方法
  • Java没有对象和集合初始化器表达式
  • 访问修饰符有所不同-在Java中(当前)没有程序集的直接等效项,因此没有“内部”可见性的想法;在C#中,不存在Java中等同于名称空间(和继承)的“默认”可见性
  • Java和C#中的初始化顺序稍有不同(C#在对基本类型的构造函数进行链式调用之前执行变量初始化程序)
  • Java没有作为语言一部分的属性。它们是get / set / is方法的约定
  • Java没有等效的“不安全”代码
  • 与Java的JNI相比,C#(通常是.NET)中的Interop更容易
  • Java和C#的枚举概念有些不同。Java更加面向对象。
  • Java没有预处理程序指令(在C#中为#define,#if等)。
  • Java没有等效的C#refout通过引用传递参数
  • Java没有等效的部分类型
  • C#接口无法声明字段
  • Java没有无符号整数类型
  • Java不支持十进制类型的语言。(java.math.BigDecimal提供了类似 System.Decimal的东西-有所不同-但没有语言支持)
  • Java没有等效的可空值类型
  • Java中的装箱使用预定义(但为“正常”)引用类型,并对它们进行特定操作。C#和.NET中的装箱是一个更加透明的事情,对于任何值类型,CLR都会为装箱创建一个引用类型。

这并不详尽,但涵盖了我能想到的所有内容。


24
@Brian:我认为Java泛型和内部类的细节很快就打破了Java通过简单性实现优越性的想法;)
Jon Skeet

8
@OrangeDog:IMO在争论的人大多是在自欺欺人。很难看出,与使用using语句IMO相比,被迫编写一个明确的try / finally块不容易出错。与Java相比,大多数C#的“额外”功能都意味着您可以减少编写代码的数量,而使代码更具可读性。
乔恩·斯基特

17
@OrangeDog:出于兴趣,你有多公正?是的,我是C#爱好者,但也具有相当丰富的Java经验-毕竟,这是我的日常工作。并不是我不知道如何有效地使用Java。
乔恩·斯基特

8
@OrangeDog:首先,据我所知,大多数开发人员都不使用“不安全”来编写代码,所以这是一个红色的鲱鱼。我还认为可证明性是一个红鲱鱼-我认为形式可证明性与对代码进行推理的难易程度没有太大关系。我的观点是,作为一个在Java和C#方面都非常有经验的人,我发现C#在生产率和可读性方面是一种非常优越的语言。如果您有相反的看法,您能否阐明两种语言的经验水平?我认为这与讨论非常相关。
乔恩·斯基特

21
@OrangeDog:此外,您声称“能够做更多的事情会增加您做错事的可能性”也是一个谬误的IMO ...,因为它假设如果您无法使用菜单项的功能来做某事语言使操作变得简单,您根本不需要这样做。这完全是不正确的-通常,您需要用Java和C#完成的任务是相同的,但是由于缺少功能,Java使得正确完成这些任务变得更加困难。通过简化任务,该功能降低了您执行错误操作的可能性。
乔恩·斯基特

24

以下是Dare Obasanjo关于C#与Java之间的区别的深入参考。在两者之间切换时,我总是会提到本文。

http://www.25hoursaday.com/CsharpVsJava.html


2
@Jon Skeet:您是最活跃的C#开发人员。为什么不维护C#和Java差异的版本。我敢打赌,人们会喜欢阅读它。
抓取

1
@claws:我没有时间做我想做的所有事情。
乔恩·斯基特

19
@温斯顿:我们需要“查克·诺里斯与乔恩·斯基特之间的区别”清单:1)查克·诺里斯总是有时间;乔恩必须修改TimeDate类以便始终有时间,而还没有时间:(
RedFilter 2010年

11

C#具有非常方便的自动属性,并且它们还至少在您没有在getter和setter中没有自定义逻辑的情况下,还可以使代码保持整洁。


10

Java中缺少的C#的功能•C#包含更多原始类型和捕获算术异常的功能。

•包括大量的Java符号注释便利,其中许多,例如运算符重载和用户定义的强制转换,已经为C ++程序员社区所熟悉。

•事件处理是“头等公民”,它是语言本身的一部分。

•允许定义“结构”,这些结构类似于类,但可以在堆栈上分配(与C#和Java中类的实例不同)。

•C#将属性实现为语言语法的一部分。

•C#允许switch语句对字符串进行操作。

•C#允许提供闭包功能的匿名方法。

•C#允许迭代器通过功能样式的yield关键字使用协程。

•C#支持输出参数,帮助返回多个值,C ++和SQL共享此功能。

•C#能够为命名空间添加别名。

•C#具有“显式成员实现”,该类允许类单独实现接口的方法,而与其自身的类方法分开。这还允许它实现两个不同的接口,碰巧具有相同名称的方法。接口的方法不必是公共的。它们只能通过该界面进行访问。

•C#提供与COM的集成。

•按照C和C ++的示例,C#允许按引用调用基本类型和引用类型。

C#中缺少Java的功能

•Java的strictfp关键字保证浮点运算的结果在各个平台之间保持相同。

Java支持受检查的异常,以更好地实施错误捕获和处理。



5

泛型:

使用Java泛型,实际上并不会获得.NET所带来的任何执行效率,因为当您使用Java编译泛型类时,编译器会删除类型参数并在各处替换Object。例如,如果您有一个Foo<T>类,则Java编译器会像生成Byte Code一样生成Byte Code Foo<Object>。这意味着必须在“背景”中进行投射以及装箱/拆箱。

我已经使用Java / C#已有一段时间了,我认为,正如您所指出的,语言级别的主要区别是委托。


这是错误的,泛型擦除或规范化(分别为Java和C#)并不一定会影响性能。
Miguel Ping

您将自动装箱与投射混淆了。
JesperE

3
不,Bruno关于性能差异是正确的。在Java中,通常无法获得与List <byte>等效的方法。您必须拥有一个List <Byte>,这将导致拳击处罚(时间和记忆)。
乔恩·斯基特

(un)装箱仅适用于装箱的类型,它们是基本类型。
Miguel Ping


0

请通过下面给出的链接msdn.microsoft.com/en-us/library/ms836794.aspx它涵盖了C#和Java之间的相似之处和不同之处

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.