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

2022-08-31 06:07:48

我只想澄清一件事。这不是一个哪一个更好的问题,我留给别人讨论的那部分。我不在乎它。我在求职面试中被问到这个问题,我认为学习更多知识可能会很有用。

这些是我能想到的:

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

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

更新:我刚刚想到,Java没有类,方法等上的自定义属性。还是?


答案 1

比较 Java 7 和 C# 3

(这里没有提到Java 7的某些功能,但所有版本的C#相对于Java 1-6的声明优势已被删除。using

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

  • 在 Java 中,默认情况下,方法是虚拟的,但您可以使它们成为最终方法。(在 C# 中,默认情况下它们是密封的,但你可以使它们成为虚拟的。
  • Java有很多IDE,既是免费的(例如Eclipse,Netbeans)又是商业的(例如IntelliJ IDEA)

除此之外(以及您的摘要中已经包含的内容):

  • 两者之间的泛型完全不同;Java泛型只是一个编译时的“技巧”(但在这方面是一个有用的技巧)。在C#和.NET中,泛型也在执行时维护,并且适用于值类型和引用类型,保持适当的效率(例如,a作为支持它,而不是盒装字节数组)。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没有等同于“不安全”的代码
  • 互操作在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 会为任何值类型的装箱创建一个引用类型。

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


答案 2

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

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


推荐