C#和Java有什么主要区别?

时间:2008-11-17 10:07:24

标签: c# .net clr java

我只想澄清一件事。这不是一个更好的问题,我要留给其他人讨论。我不在乎。 在我的求职面试中,我被问到这个问题,我认为学习更多内容可能会有所帮助。

这些是我能想到的:

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

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

更新: 刚刚出现在我的脑海中,Java没有类似于类,方法等的自定义属性。或者是吗?

7 个答案:

答案 0 :(得分:329)

比较Java 7和C#3

(此处未提及Java 7的某些功能,但已删除所有C#over Java 1-6版本的using语句优势。)

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

  • 在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 methods
  • 的约定
  • Java没有相当于“不安全”的代码
  • Interop在C#(和一般的.NET)中比Java的JNI
  • 更容易
  • Java和C#对枚举有一些不同的看法。 Java更加面向对象。
  • Java没有预处理器指令(C#中的#define,#if等)。
  • Java没有相当于C#的refout用于通过引用传递参数
  • Java没有等效的部分类型
  • C#接口无法声明字段
  • Java没有无符号整数类型
  • Java对小数类型没有语言支持。 (java.math.BigDecimal提供之类的 System.Decimal - 有差异 - 但没有语言支持)
  • Java没有等效的可空值类型
  • Java中的Boxing使用预定义(但“正常”)引用类型,并对它们进行特定操作。 C#和.NET中的拳击是一个更透明的事情,CLR为任何值类型创建了一个引用类型。

这并非详尽无遗,但它涵盖了我能想到的一切。

答案 1 :(得分:24)

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

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

答案 2 :(得分:11)

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

答案 3 :(得分: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支持已检查的异常,以便更好地实施错误捕获和处理。

答案 4 :(得分:9)

另一个好资源是http://www.javacamp.org/javavscsharp/ 该网站列举了许多说明这两种编程语言之间几乎所有差异的例子。

关于属性,Java有注释,它的工作方式几乎相同。

答案 5 :(得分:5)

泛型:

使用Java泛型,实际上并没有获得.NET带来的任何执行效率,因为当您在Java中编译泛型类时,编译器会删除type参数并在任何地方替换Object。例如,如果您有Foo<T>类,则java编译器会生成字节代码,就好像它是Foo<Object>一样。这意味着铸造以及装箱/拆箱必须在“背景”中完成。

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

答案 6 :(得分:0)

请仔细阅读以下链接          msdn.microsoft.com/en-us/library/ms836794.aspx 它涵盖了C#和java

之间的相似性和差异