Comparing Java 7 and C# 3
(这里没有提到Java7的一些特性,但是所有版本的C#相对于Java1-6的using
语句优势已经消除.)
您的摘要并非全部正确:
- 在Java中,方法是虚拟的by default,但你可以把它们变成最终的.(在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没有静电类(没有any个实例构造函数,不能用于变量、参数等)
- Java没有任何与C#3.0匿名类型等效的类型
- Java没有隐式类型的局部变量
- Java没有扩展方法
- Java没有对象和集合初始值设定项表达式
- 访问修饰符有些不同--在Java中(目前)没有程序集的直接类似功能,因此没有"内部"可见性的概念;在C#中,没有类似功能于Java中的"默认"可见性,它考虑了命名空间(和继承)
- Java和C#中的初始化顺序略有不同(C#在对基类型的构造函数进行链式调用之前执行变量初始值设定项)
- Java没有属性作为语言的一部分;它们是get/set/is方法的约定
- Java没有"不安全"代码的类似功能
- 与Java的JNI相比,C#(和.NET)中的互操作更容易
- Java和C#对枚举有一些不同的 idea .Java更加面向对象.
- Java没有预处理器指令(#define,#if etc in C#).
- Java没有C#的
ref
和out
等效项来通过引用传递参数
- Java没有部分类型的类似功能
- C#接口不能声明字段
- Java没有无符号整数类型
- Java不支持十进制类型.(java.math.BigDecimal提供了一些like System.Decimal的东西——虽然有差异——但没有语言支持)
- Java没有可空值类型的类似功能
- Java中的装箱使用预定义(但"正常")引用类型,并对其执行特定操作.C#和.NET中的装箱是一件更透明的事情,CLR为任何值类型的装箱创建了一个引用类型.
这并不是详尽无遗的,但它涵盖了我能马上想到的一切.