微软公司的老对手Sun公司推出了Java语言,并获得了Oracle和IBM公司的全力支持。微软公司需要一项新技术来确保在软件业的统治地位时,它在Anders Hejlsberg的帮助下,经过几年时间的埋头苦干,C#已成为微软公司反击Java语言的最有力武器。目前各大软件公司都争先恐后地把各自的应用程序移植为面向手持设备和个人电脑的互联网服务,因此微软公司希望软件公司会采用C#语言来编写各自的基于Web的软件和服务。同样,微软公司也希望商家能采用.Net家族的电子商务软件来运行Web服务。是的,微软公司希望用C#来打倒Java。
那么我们就来对比一下Java和C#:
功能比较 | C# | Java |
继承 | 单继承,可实现多个接口 | |
接口实现 | 通过Interface | |
异常处理 | 提供异常处理 | |
单一的公共积累 | 是Object | |
内存管理 | 由运行时环境管理,使用垃圾收集器 | |
指针 | 支持,但是只是在很少使用的非安全模式下才支持。通常引用取代指针 | 完全不支持,引用替代 |
源代码编译后的形式 | .Net中间语言 | 字节码 |
语言规范比较 | C# | Java |
简单数据类型 | 多 | 少 |
常量 | Const声明,未确定常量值,可用readonly | 使用Static final修饰符 |
公用类的入口点 | main方法的参数是String对象数组,它没有返回值,可不带参数,还可返回int | main方法的参数是String对象数组,它没有返回值 |
Switch语句 | 能处理整数和字符变量 | 只能处理整数 |
Foreach语句 | 枚举集合中的各个元素,为集合中的每一个元素执行一次代码块 | |
移位操作符 | 没有“>>”操作符 | 有“>>”操作符 |
Goto关键字 | 有 | 无,用break或continue代替 |
声明数组 | 数组声明中的方括号必须跟在数据类型后面,且不能放在变量名称之后:类型【】数组名 如:int[] array 可以同时指定数组长度和初值,但初值的数目必须一致: Int[] array = new int[3]{1,2,3} | 方括号可以放在变量名前或后:类型【】数组名或 类型数组名【】 如 int【】 array 或 int array[] 如果赋初值,就不能指定长度,如果指定了长度,就不能同时赋初值: Int[] array = new int[3]; Int[] array = new int[]{1,2,3}; |
包 | 被称为名称空间,可以为其制定别名 | 有 |
默认包 | 有 | 不存在 |
面向对象语言 | 是 | 是 |
可访问性 | 基本相同(C#多了一个internal) | |
派生类 | 采用C++类派生语法 | 使用“extends”关键字 |
最终类 | 使用“sealed”关键字 | “Final”关键字 |
接口 | C#中的接口不能包含域,指定public修饰符是非法 | 除去前面两点,基本相同 |
垃圾收集 | 用垃圾收集器来解决这个问题,由垃圾收集器搜集不再使用的对象并释放内存(C#可以手工管理) | |
Is和as操作符 | 都有 | 没有as操作符 |
类 | 没有自己的类库,但是可共享.NET的类库 | 有 |
异常处理 | 相同 | |
|
|
|
新增功能 | C# |
枚举器 | 枚举器即enum类型(Enumerator,或称为计数器),它是一个相关常量的集合。精确地说,enum类型声明为一组相关的符号常量定义了一个类型名字 |
结构 | 结构(Struct)与类很相似。然而,类是作为一种引用类型在堆中创建,而结构是一种值类型,它存储在栈中或者是嵌入式的。因此,只要谨慎运用,结构要比类快。结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。 |
属性 | 属性是一个与类或对象关联的命名的特征。属性是域的一种自然扩展――两者都是有类型、有名字的类成员。 |
引用方式传递简单数据类型的参数 | 在Java中,当你把一个简单数据类型的值作为参数传递给方法时,参数总是以值的方式传递――即,系统将为被调用的方法创建一个参数值的副本。在C#中,你可以用引用的方式传递一个简单数据类型的值。此时,被调用的方法将直接使用传递给它的那个值――也就是说,如果在被调用方法内部修改了参数的值,则原来的变量值也随之改变。 |
保留了指针 | 用既不安全也不容易使用的“古老的”指针来提高程序的性能。C#提供了支持“不安全”(unsafe)代码的能力,这种代码能够直接操作指针,能够“固定”对象以便临时地阻止垃圾收集器移动对象。无论从开发者还是用户的眼光来看,这种对“不安全”代码的支持其实是一种安全功能。“不安全”的代码必须用unsafe关键词显式地标明,因此开发者不可能在无意之中使用“不安全”的代码。同时,C#编译器又和执行引擎协作,保证了“不安全”的代码不能伪装成为安全代码。 |
代理 | 是面向对象的、类型安全的、可靠的。而且,函数指针只能用来引用静态函数,但代理既能够引用静态方法,也能够引用实例方法。代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。 |
包装和解除包装 | 包装是一种让值类型看起来象引用类型的处理过程。当一个值类型(简单数据类型)被用于一个要求或者可以使用对象的场合时,包装操作自动进行。包装一个value-type值的步骤包括:分配一个对象实例,然后把value-type值复制到对象实例。 |
对于学习C#和Java哪个语言跟好,我觉得这句话最经典“一法通,百法通”。