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

我只想澄清一件事。 这不是一个更好的问题,我留给其他人讨论。 我不在乎。 我在工作面试中被问及这个问题,我认为多学一点可能会有帮助。

这些是我能想到的:

  • Java是“独立于平台”的。 那么现在你可以说有Mono项目,所以C#也可以考虑,但是我相信它有点夸张。 为什么? 那么,当一个新的Java版本完成时,它同时在它所支持的所有平台上都可用,另一方面,Mono实现中仍然缺lessC#3.0的多less特性? 或者是真的CLR与JRE我们应该在这里比较?
  • Java不支持事件和委托。 我所知道的。
  • 在Java中,所有方法都是虚拟的
  • 开发工具:我相信目前还没有像Visual Studio这样的工具。 特别是如果你使用团队版本,你会明白我的意思。

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

更新:只是popup我的想法,Java没有像类,方法等自定义属性的东西或者呢?

比较Java 7和C#3

(这里没有提到Java 7的一些特性,但是删除了所有版本的C#over Java 1-6的using语句优势。)

并非所有的总结都是正确的:

  • 在Java中,方法默认是虚拟的但是可以使它们成为最终的。 (在C#中,它们默认是封闭的,但是可以使它们变成虚拟的。)
  • Java有很多IDE,既有免费的(如Eclipse,Netbeans),也有商业的(如IntelliJ IDEA)

除此之外(以及你的总结中已经有了):

  • generics在两者之间是完全不同的; Java的generics只是一个编译时间的“技巧”(但在这方面很有用)。 在C#和.NET中,generics在执行时也被维护,并且为值types和引用types工作,保持适当的效率(例如List<byte>作为byte[]支持它,而不是一个盒装字节数组。)
  • C#没有检查exception
  • Java不允许创build用户定义的值types
  • Java没有运算符和转换重载
  • Java没有简单实现迭代器的迭代器块
  • Java没有像LINQ那样的东西
  • 部分原因是没有委托,Java没有什么比匿名方法和lambdaexpression式更像。 匿名内部类通常填充这些angular色,但是笨重。
  • Java没有expression式树
  • C#没有匿名的内部类
  • C#根本没有Java的内部类,实际上C#中的所有嵌套类都像Java的静态嵌套类
  • Java没有静态类(没有任何实例构造函数,也不能用于variables,参数等)
  • Java没有与C#3.0匿名types的任何等价物
  • Java没有隐式types化的局部variables
  • Java没有扩展方法
  • Java没有对象和集合初始值expression式
  • 访问修饰符有些不同 – 在Java中(目前)没有直接的组件相当于,所以不知道“内部”的可见性; 在C#中,没有相当于Java中的“默认”可见性,它考虑了名称空间(和inheritance)
  • Java和C#中的初始化顺序略有不同(C#在链接调用基types的构造函数之前执行variables初始化)
  • Java没有属性作为语言的一部分; 他们是get / set /方法的约定
  • Java没有相当于“不安全”的代码
  • Interop在C#(和一般的.NET)中比Java的JNI更容易
  • Java和C#有一些不同的枚举想法。 Java的更加面向对象。
  • Java没有预处理指令(#define,#if等在C#中)。
  • Java没有相当于C#的ref ,只能通过引用传递参数
  • Java没有等价的部分types
  • C#接口不能声明字段
  • Java没有无符号的整数types
  • Java对小数types没有语言支持。 (java.math.BigDecimal提供了类似于 System.Decimal的东西 – 有区别 – 但是没有语言支持)
  • Java没有可以为null的值types
  • Java中的拳击使用预定义的(但是“正常的”)引用types对它们进行特定的操作。 在C#和.NET中的拳击是一个更透明的事情,与CLR为任何值types的拳击创build引用types。

这并不是详尽无遗的,但它覆盖了我能想到的所有东西。

以下是Dare Obasanjo对C#和Java之间差异的深入参考。 在两者之间切换时,我总是发现自己指的是这篇文章。

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

C#具有非常方便的自动属性,它们也有助于保持代码更清洁,至less在getter和setter中没有自定义逻辑的时候。

Java中C#缺失的特性•C#包含更多的原始types和捕获算术exception的function。

•包含大量的Java标记方便,其中很多(例如运算符重载和用户定义的强制types)已经为大型C ++程序员所熟悉。

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

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

C#实现了属性作为语言语法的一部分。

C#允许switch语句对string进行操作。

C#允许匿名方法提供闭包function。

•C#允许迭代器通过函数式yield关键字使用协同例程。

C#支持输出参数,帮助返回多个值,一个由C ++和SQL共享的特性。

C#有能力别名命名空间。

•C#有“显式成员实现”(Explicit Member Implementation),它允许一个类专门实现一个接口的方法,与它自己的类方法分开。 这也允许它实现两个碰巧具有相同名称的方法的不同接口。 接口的方法不需要公开; 他们只能通过该界面访问。

C#提供了与COM的集成。

•以C和C ++为例,C#允许通过引用调用原始types和引用types。

C#中Java缺失的特性

Java的strictfp关键字保证浮点操作的结果在不同平台上保持一致。

Java支持检查exception,以更好地执行错误捕获和处理。

另一个很好的资源是http://www.javacamp.org/javavscsharp/这个网站列举了很多例子来说明这两种编程语言几乎所有的区别。;

关于属性,Java有Annotations,工作方式几乎相同。

generics:

对于Javagenerics而言,实际上并没有获得任何.NET的执行效率,因为在Java中编译generics类时,编译器会取消types参数,并将Objectreplace为任何地方。 例如,如果你有一个Foo<T>类,那么java编译器生成的字节码就好像它是Foo<Object> 。 这意味着铸造和拳击/拆箱将不得不在“背景”中完成。

我一直在玩Java / C#一段时间,在我看来,在语言层面上的主要区别是,正如你所指出的,代表。

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