一尘不染

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

c#

已锁定 。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。

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

这些是我能想到的:

  • Java是“平台无关的”。如今,您可以说存在Mono项目,因此也可以考虑使用C#,但我认为这有点夸张。为什么?好了,当Java的新发行版完成时,它同时可在其支持的所有平台上使用,另一方面,Mono实现中仍缺少多少C#3.0功能?还是我们应该在这里比较的是CLR vs. JRE
  • Java不支持事件和委托。我所知道的。
  • 在Java中,所有方法都是虚拟的
  • 开发工具:我相信还没有像Visual Studio这样的工具。尤其是如果您使用过团队版本,您将了解我的意思。

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

更新:我突然想到,Java在类,方法等上没有自定义属性,是吗?


阅读 662

收藏
2020-05-19

共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[]后盾,而不是盒装字节数组)。
  • 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没有等效的“不安全”代码
  • 与Java的JNI相比,C#(通常是.NET)中的Interop更容易
  • Java和C#的枚举概念有些不同。Java更加面向对象。
  • Java没有预处理程序指令(在C#中为#define,#if等)。
  • Java有没有对应的S C#“ ref,并out通过引用传递参数
  • Java没有等效的部分类型
  • C#接口无法声明字段
  • Java没有无符号整数类型
  • Java不支持十进制类型的 语言 。(java.math.BigDecimal提供了 类似 System.Decimal的功能,但有所不同,但是没有语言支持)
  • Java没有等效的可空值类型
  • Java中的装箱使用预定义(但为“常规”)引用类型,并对它们进行特定操作。C#和.NET中的装箱是一个更透明的事情,对于任何值类型,CLR都会为装箱创建一个引用类型。

这并不详尽,但涵盖了我能想到的所有内容。

2020-05-19