这里大致用C#3.0与Java6.0做比较。
写完后得知维基百科里有更加全面得多的比较:
.NET(C#)
Java
基本类型
基本类型
C#中有无符号数,Java没有。
C#中有值类型,且可自己定义值类型的结构体(struct)。
Java中的基本类型(或叫基元类型)即为值类型,
C#中的值类型(包括所有基本类型)间接继承自Object,
C#中int等同于System.Int32,是值类型;
Java中int是基本类型,是值类型,
Java中的int与Integer的对应在C#
其他基本类型与之类似。
委托,事件
[无]
C#中的委托可以认为是方法的类型化,
Java通过接口来实现C#中委托和事件的功能,
另,C#中也有匿名类,但C#
非托管
[无]
C#可以有非托管代码,可以有指针等。Java没有。
索引器
[无]
C#有索引器,可方便容器类实现类似数组的效果。Java没有,
属性
[无]
C#的属性通过在内部定义get/set方法,
Java没有属性的概念。
预编译指令
[无]
C#有预编译指令可方便调试,
操作符重载
[无]
C#可重载操作符。Java没有。
Java自己重载了String的+和+=,但没有重载==,
内部类
内部类
Java的内部类可以直接访问外部类的实例成员。
C#的不行。C#的内部类等同于Java的静态内部类。
goto、switch
[goto]、switch
C#允许用goto。Java的goto是保留关键字,
C#的switch可以使用long、String;
Java的switch中的case子句在后面没有跟break
C#
enum
enum
C#中的枚举是值类型,且其基于数值类型(默认基于int),
Java中的枚举是引用类型(Java除了基本类型外,
C#和Java的枚举都可以用于switch。
可以将C#的枚举作为数值看待而直接进行位运算,
Java的枚举跟数值没有直接关系,因此不能直接这么用。
override
@Override
C#能被重写的方法必须添加virtual关键字声明为虚方法,
Java默认方法都可被重写,
定制特性
标注
C#用中括号[]将定制特性括起来。Java用@打头,
泛型
泛型
Java中泛型实现使用的擦除机制,
Java的泛型不支持值类型(使用的话会被自动包装成引用类型)
C#的泛型在类型参数传入类型后会产生一个新类型(
对于Java的泛型,简单的讲,它的好处只在编译时,
参数引用传递
[无]
C#允许使用关键字out,
Java只有值传递。
@字符串
[无]
C#在写字符串时可以在引号前加个@符号来取消/的转义作用。
Java没有。
??
[无]
C#的??
Java没有。
using
import
C#可以用using为命名空间或类指定别名。(
Java的import可以引入类或包(即C#的命名空间),
初始化
初始化
C#调用基类构造函数的语法为:
SubClass() : base() { }
Java调用基类构造函数的语法为:
SubClass(){
super();
}
C#和Java都可以用类似的语法调用同一个类的其他构造函数。
Java有代码块概念,会在构造函数之前执行(
在成员变量声明时赋值,
private int x = 1;
private int y = x + 10;
这里变量y的赋值语句有变量x。
C#不允许这样做。
interface
interface
Java的接口内允许有内部类、静态字段等。
C#不允许。
readonly,const
final
C#的const是绝对的常量,必须在声明语句中同时赋值,
C#
Java中的final(在约束变量的时候)
但C#的readonly和const有个区别,
而Java的final则是:有时候可以有时候不可以----
final int x = 1; // 这个可以
final int y = new Random().nextInt(); // 这个不可以
那么可以理解为:编译时能得到明确值的时候,
[无]
throws
Java在可能抛出异常时,
C#没有采用这种强制处理机制。
功能相同但语法有差异的
namespace == package (Java的package对文件结构也有要求;C#没有)
internal == [默认] (Java中不写访问修饰符即表示访问权限是package;
lock == synchronized (Java中synchronized可以修饰方法,C#
: == extends,implements
base == super
is == instanceof (C#有as,Java没有)
typeof == .class
[SerializableAttribute]定制特性 == Serializable接口
[NonSerializedAttribute]定制特性 == transient
params == ... (可变数目参数)
这个列表里,Java比C#更漂亮的地方基本上只有一处:枚举。
所以就从这次比较来讲,C#几乎完胜Java,而C#