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之间差异的深入参考。 在两者之间切换时,我总是发现自己指的是这篇文章。
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的相似之处和差异