比较 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#的,并且通过引用传递参数
ref
out
- Java 没有等效的部分类型
- C# 接口无法声明字段
- Java 没有无符号整数类型
- Java 对十进制类型没有语言支持。(java.math.BigDecimal提供了类似System.Decimal的东西 - 有差异 - 但没有语言支持)
- Java 没有等效的可空值类型
- Java 中的 Boxing 使用预定义的(但“正常”的)引用类型,并对其执行特定操作。C# 和 .NET 中的装箱是一种更加透明的事情,CLR 会为任何值类型的装箱创建一个引用类型。
这并不详尽,但它涵盖了我能想到的一切。