小编典典

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

all

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

这些是我能想到的:

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

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

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


阅读 80

收藏
2022-06-25

共1个答案

小编典典

比较 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 为任何值类型的装箱创建了一个引用类型。

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

2022-06-25