C#的诞生及与Java的比较

来源:互联网 发布:华为mate9数据恢复 编辑:程序博客网 时间:2024/06/09 20:02

 

微软公司的老对手Sun公司推出了Java语言,并获得了OracleIBM公司的全力支持。微软公司需要一项新技术来确保在软件业的统治地位时,它在Anders Hejlsberg的帮助下,经过几年时间的埋头苦干,C#已成为微软公司反击Java语言的最有力武器。目前各大软件公司都争先恐后地把各自的应用程序移植为面向手持设备和个人电脑的互联网服务,因此微软公司希望软件公司会采用C#语言来编写各自的基于Web的软件和服务。同样,微软公司也希望商家能采用.Net家族的电子商务软件来运行Web服务。是的,微软公司希望用C#来打倒Java

那么我们就来对比一下JavaC#

功能比较

C#

Java

继承

单继承,可实现多个接口

接口实现

通过Interface

异常处理

提供异常处理

单一的公共积累

Object

内存管理

由运行时环境管理,使用垃圾收集器

指针

支持,但是只是在很少使用的非安全模式下才支持。通常引用取代指针

完全不支持,引用替代

源代码编译后的形式

.Net中间语言

字节码

 

语言规范比较

C#

Java

简单数据类型

常量

Const声明,未确定常量值,可用readonly

使用Static final修饰符

公用类的入口点

main方法的参数是String对象数组,它没有返回值,可不带参数,还可返回int

main方法的参数是String对象数组,它没有返回值

Switch语句

能处理整数和字符变量

只能处理整数

Foreach语句

枚举集合中的各个元素,为集合中的每一个元素执行一次代码块

移位操作符

没有“>>”操作符

                  有“>>”操作符

Goto关键字

无,用breakcontinue代替

声明数组

数组声明中的方括号必须跟在数据类型后面,且不能放在变量名称之后:类型【】数组名

如: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#可以手工管理)

Isas操作符

都有

没有as操作符

没有自己的类库,但是可共享.NET的类库

异常处理

相同

 

 

 

 

新增功能

C#

枚举器

枚举器即enum类型(Enumerator,或称为计数器),它是一个相关常量的集合。精确地说,enum类型声明为一组相关的符号常量定义了一个类型名字

结构

结构(Struct)与类很相似。然而,类是作为一种引用类型在堆中创建,而结构是一种值类型,它存储在栈中或者是嵌入式的。因此,只要谨慎运用,结构要比类快。结构可以实现接口,可以象类一样拥有成员,但结构不支持继承。

属性

属性是一个与类或对象关联的命名的特征。属性是域的一种自然扩展――两者都是有类型、有名字的类成员。

引用方式传递简单数据类型的参数

Java中,当你把一个简单数据类型的值作为参数传递给方法时,参数总是以值的方式传递――即,系统将为被调用的方法创建一个参数值的副本。在C#中,你可以用引用的方式传递一个简单数据类型的值。此时,被调用的方法将直接使用传递给它的那个值――也就是说,如果在被调用方法内部修改了参数的值,则原来的变量值也随之改变。

保留了指针

用既不安全也不容易使用的古老的指针来提高程序的性能。C#提供了支持不安全unsafe)代码的能力,这种代码能够直接操作指针,能够固定对象以便临时地阻止垃圾收集器移动对象。无论从开发者还是用户的眼光来看,这种对不安全代码的支持其实是一种安全功能。不安全的代码必须用unsafe关键词显式地标明,因此开发者不可能在无意之中使用不安全的代码。同时,C#编译器又和执行引擎协作,保证了不安全的代码不能伪装成为安全代码。

代理

是面向对象的、类型安全的、可靠的。而且,函数指针只能用来引用静态函数,但代理既能够引用静态方法,也能够引用实例方法。代理用来封装可调用方法。你可以在类里面编写方法并在该方法上创建代理,此后这个代理就可以被传递到第二个方法。这样,第二个方法就可以调用第一个方法。
 
 
代理是从公共基类System.Delegate派生的引用类型。定义和使用代理包括三个步骤:声明,创建实例,调用。代理用delegate声明语法声明。

  包装和解除包装

包装是一种让值类型看起来象引用类型的处理过程。当一个值类型(简单数据类型)被用于一个要求或者可以使用对象的场合时,包装操作自动进行。包装一个value-type值的步骤包括:分配一个对象实例,然后把value-type值复制到对象实例。
 
 
解除包装所执行的动作与包装相反,它把一个引用类型转换成值类型。解除包装操作的步骤包括:首先检查并确认对象实例确实是给定value-type的一个经过包装的值,然后从对象实例复制出值。

 

对于学习C#Java哪个语言跟好,我觉得这句话最经典“一法通,百法通”。

 




原创粉丝点击