这次只是大概列出一些不同点,以把不同点做个备份,详细情况以后专题介绍。考虑到网上很多资料是“一个人发表,n人转载”或“一个人在n多地方发表同一篇文章”,恰好这些文章为列在搜索页面的靠前部分,所以难以获得多方面信息(由于一些类似的和其他原因,本人不喜欢去论坛)。所以本文尽量保持原创和客观。运行环境:Fedora Core 8+MonoDevelop 0.9
Note:此环境在我的机器上没有可视化图形设计器,也没有MSDN。.Net版本为1.0和2.0。(仅关键字不同的部分不在此列举)
(本次不同点大多都是在ATM大作业中遇到的,有些适当扩展了)1.解决命名冲突
namespace和package都具有防止命名冲突的能力。但是namespace没有对文件系统的布局产生影响。换句话说当你要写程序查找任意namespace类的源码时难以确定其具体位置。2.反射
映象中Java是唯一支持reflection技术的高级语言(脚本语言除外),C#效仿了这一点,但是C#只能获取public成员,也就是说很多时候这个功能在C#里的功效大大降低了,但是同时也保证了自己所写库的安全。3.clone
C#同时支持struct和class,他们都继承Object。前者与后者的本质区别是前者是值类型而后者是引用类型,(有关其他区别这里不详细列出)。在代码编写上我的环境中struct和class完全一样,但在vs里会有细微差别,vs的提示很详细,这里不列出了。由于.net framework中兼有了struct和class,并且两者都可以使用new name的方式实例化,猜想正是这个原因导致了C#的Clone方法需要类显式实现Cloneable接口。Java中的Object便直接具有 clone方法。4.继承
C#继承和实现接口的语法相同,都是“子类名 冒号父类名和接口列表”。不支持多重继承。同样C#类的构造方法中不允许出现对父类和自己的引用,必须放在构造函数名和冒号的后面(这是C++的方式)。接口中的成员不许要访问修饰符,因为它们是public的,你写了反而编译器要报怨。5.代理
这是C#的新机制,但是并非信思想,类似C的函数指针,Java可以用单方法接口来模拟。同时熟悉动态脚本语言如JavaScript的话,便会发现,代理就如同它们的Function对象。不过代理能力更强,因为它可以联接多个方法。6.属性
C#具有隐式获取和访问方法(get和set),Java没有,但默写Java规范如JavaBeans中有,规则为setXXX和getXXX。其实 C#的属性本质上也是private成员+两个方法(因此C#属性声明可以是abstract的,也可以出现在接口中),和Java效果一样。但是在.Net 3中,C#编译器可以根据get和set自动添加响应的private属性,这使得C#的属性更纯粹一点,真正保持了代码的简洁。7.异常处理。
C#不用声明“异常说明”,记在方法名后不用throws,所有C#异常都像Java的RuntimeException。这个使得其他人使用C#的库时不得不查找其文档。(难怪微软的MSDN不是免费的呢)8多态
这个C#是乱上加乱,共有abstract,virtual,override,new三个关键字。并且C#在实现多态时调用的方法始终是 “override returntype method”的形式,所以不要报怨为何你有了String ToString方法,却还是得不到期望的输出。
有关这个的详细讨论有时间另开专题。9别名
这个Java里没有,C#中用的最多的地方就是string和String,以及其他基本类型。C#完全面向对象,所以基本类型如int是其对象类型Int32的别名,换句话说它们等价,而java只是用自动包装机制来达到这个目的。10.事件处理
这个就很复杂了,C#基于“代理”,Java基于“事件监听”。
有关这个的详细讨论有时间另开专题。11.文件处理
C#除了像Java那样,还可以使用类似C的方式。
有关这个的详细讨论有时间另开专题。12.窗体设计
C#可以像VB那样直接拖拉,不过我的环境没有可视化设计器,不过我比较喜欢自己这种动态生成控件(Java称为组件)的方式。因为C#的具有partial类的原因。通过窗体设计器生成的类不是完整的。所以看不到一个完成的程序,比较郁闷。
C#的gui环境是线程完全的,Java官方的gui环境不是线程安全的。
有关这个的详细讨论有时间另开专题。就先写这么多吧。