转自:C#与Java的比较
2015-06-26
一、C#、C++和Java
二、语言规范的比较
2.1、简单数据类型
2.2、常量
2.3、公用类的入口点
2.4、switch语句
2.5、foreach语句
2.6、C#没有>>>移位操作符
2.7、goto关键词
2.8、声明数组
2.9、包
2.10、默认包
2.11、面向对象
2.12、可访问性
2.13、派生类
2.14、最终类
2.15、接口
2.16、is和as操作符
2.17、库
2.18、垃圾收集
2.19、异常处理
三、Java没有的功能
3.1、枚举器
3.2、结构
3.3、属性
3.4、以引用方式传递简单数据类型的参数
3.5、C#保留了指针
3.6、代理
3.7、包装和解除包装
C#(C-Sharp)是Microsoft的新编程语言,被誉为“C/C++家族中第一种面向组件的语言”。然而,不管它自己宣称的是什么,许多人认为C#更像是Java的一种克隆,或者是Microsoft用来替代Java的产品。事实是否是这样的呢?
本文的比较结果表明,C#不止是Java的同胞那么简单。如果你是一个Java开发者,想要学习C#或者了解更多有关C#的知识,那么本文就是你必须把最初10分钟投入于其中的所在。
一、C#、C++和Java
C#的语言规范由Microsoft的Anders Hejlsberg与Scott Wiltamuth编写。在当前Microsoft天花乱坠的宣传中,对C#和C++、Java作一番比较总是很有趣的。考虑到当前IT媒体的舆论倾向,如果你早就知道C#更接近Java而不是C++,事情也不值得大惊小怪。
对于刚刚加入这场讨论的读者,下面的表1让你自己作出判断。显然,结论应该是:Java和C#虽然不是孪生子,但C#最主要的特色却更接近Java而不是C++。
|
表1:比较C#、C++和Java最重要的功能 |
|||
|
功能 |
C# |
C++ |
Java |
|
继承 |
允许继承单个类,允许实现多个接口 |
允许从多个类 继承 |
允许继承单个类,允许实现多个接口 |
|
接口实现 |
通过“interface”关键词 |
通过抽象类 |
通过“interface”关键词 |
|
内存管理 |
由运行时环境管理,使用垃圾收集器 |
需要手工管理 |
由运行时环境管理,使用垃圾收集器 |
|
指针 |
支持,但只在很少使用的非安全模式下才支持。通常以引用取代指针 |
支持,一种很常用的功能。 |
完全不支持。代之以引用。 |
|
源代码编译后的形式 |
.NET中间语言(IL) |
可执行代码 |
字节码 |
|
单一的公共基类 |
是 |
否 |
是 |
|
异常处理 |
异常处理 |
返回错误 |
异常处理。 |
二、语言规范的比较
2.1、简单数据类型
简单数据类型(Primitive)在C#中称为值类型,C#预定义的简单数据类型比Java多。例如,C#有unit,即无符号整数。
表2列出了所有C#的预定义数据类型:
|
表2:C#中的值类型 |
|
|
类型 |
说明 |
|
object |
所有类型的最终极的基类 |
|
string |
字符串类型;字符串是一个Unicode字符的序列 |
|
sbyte |
8位带符号整数 |
|
short |
16位带符号整数 |
|
int |
32位带符号整数 |
|
long |
64位带符号整数 |
|
byte |
8位无符号整数 |
|
ushort |
16位无符号整数 |
|
uint |
32位无符号整数 |
|
ulong |
64位无符号整数 |
|
float |
单精度浮点数类型 |
|
double |
双精度浮点数类型 |
|
bool |
布尔类型;bool值或者是true,或者是false |
|
char |
字符类型;一个char值即是一个Unicode字符 |
|
decimal |
有28位有效数字的高精度小数类型 |
2.2、常量
忘掉Java中的static final修饰符。在C#中,常量可以用const关键词声明。
public const int x = 55;
此外,C#的设计者还增加了readonly关键词。如果编译器编译时未能确定常量值,你可以使用readonly关键词。readonly域只能通过初始化器或类的构造函数设置。
2.3、公用类的入口点
在Java中,公用类的入口点是一个名为main的公用静态方法。main方法的参数是String对象数组,它没有返回值。在C#中,main方法变成了公用静态方法Main(大写的M),Main方法的参数也是一个String对象数组,而且也没有返回值,如下面的原型声明所示:
public static void Main(String[] args)
但是,C#的Main方法不局限于此。如果不向Main方法传递任何参数,你可以使用上述Main方法的一个重载版本,即不带参数列表的版本。也就是说,下面的Main方法也是一个合法的入口点:
public static void Main()
另外,如果你认为有必要的话,Main方法还可以返回一个int。例如,下面代码中的Main方法返回1:
1 using System; 2 3 public class Hello { 4 5 public static int Main() { 6 7 Console.WriteLine("Done"); 8 9 return 1; 10 11 } 12 13 }