209

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

这些是我能想到的:

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

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

更新:我突然想到,Java 没有类、方法等的自定义属性。或者是吗?

4

7 回答 7

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[]支持它的 a,而不是盒装字节数组。)
  • 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 没有相当于“不安全”的代码
  • C#(和一般的 .NET)中的互操作比 Java 的 JNI 更容易
  • Java 和 C# 对枚举有一些不同的想法。Java 更加面向对象。
  • Java 没有预处理器指令(C# 中的#define、#if 等)。
  • Java 没有 C# 的等价物,并且无法ref通过out引用传递参数
  • Java 没有等价的部分类型
  • C# 接口不能声明字段
  • Java 没有无符号整数类型
  • Java 没有对十进制类型的语言支持。(java.math.BigDecimal 提供类似System.Decimal 的东西 - 有区别 - 但没有语言支持)
  • Java 没有可空值类型的等价物
  • Java 中的装箱使用预定义的(但“正常的”)引用类型以及对它们的特定操作。C# 和 .NET 中的装箱是一件更透明的事情,CLR 为任何值类型的装箱创建了一个引用类型。

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

于 2008-11-17T10:16:58.687 回答
24

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

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

于 2008-11-17T10:55:11.153 回答
11

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

于 2008-11-17T13:56:23.520 回答
10

C# Absent in Java 的特性 • 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 支持检查异常以更好地执行错误捕获和处理。

于 2012-01-04T16:01:13.337 回答
9

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

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

于 2008-11-20T13:40:52.300 回答
5

泛型:

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

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

于 2008-11-17T10:14:43.403 回答
0

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

于 2014-05-02T08:40:35.070 回答