这篇文章可能尤其适合于初学者!
2002年,我刚刚毕业一年。恰巧有一个OA项目,领导让我负责,由我来决定使用C#还是Java。我选择了C#。原因很简单,当时就看中了它的对象属性的写法和用法。当然,之前我主要是在用C/C++,也用过比较多的Java,就是因为有这种对比,从而喜欢并选择了它。
[Java]
public class Person
{
private string name;
public string getName(){return this.name;}
public void setName(string value){this.name = value;}
}
Person person = new Person();
person.setName(“Vincent”);
System.out.print(person.getName());
[C#]
public class Person
{
private string name;
public string Name
{
get{return this.name;}
set{this.name = value;}
}
}
Person person = new Person();
person.Name = “Vincent”;
System.Console.WriteLine(person.Name);
当然,C#1.0还是主要借鉴了Java的很多内容。不过,这一点也无可厚非,这个世界就是相互拿来的结果——尤其是在我们的国家。现在,Java不是也在学习C#的很多东西么?
这9年来,我与C#相依为命,严格说来,我是依它为命!从惨不忍睹,到如履薄冰,再到现在的踏实有余,经历了很多,也总结了很多。在接下来的时日中,我会把我对C#的理解,逐一分享给大家。
关于.NET与Java的争论由来已久,尤其是.NET刚刚推出的时候。我的观点的是:不要争论!.NET与Java的基本技术思想是完全一致的——它们都是堆栈计算机(关于何谓堆栈计算机,我将有专门的文章进行说明)。下面,我简单描述下它们各自的特点,注意不是优缺点!
在描述之前,我首先说明一点。
Java既是一种语言,又是一种软件的开发和运行平台或框架。经过这么多年的发展,我个人认为Java已经不再单纯是一种语言的代名词了(我不做Java很久了,班门弄斧,请勿见怪)。
.NET不是一种语言,而是一种框架。在这种框架之上,会有多种语言,C#只是其中的一种语言。这多种语言包括C#、F#、J#、VB.NET、VC.NET、JScript等等。
(1) Java能够跨越不同的平台(这里的平台通常是指操作系统和CPU/指令集)。但是千万不要认为.NET不可以。.NET与Java的基本技术思想几乎是完全一致的,因此,.NET理论上也可以跨越不同的平台。只是,微软出于对自己的Windows操作系统的市场和垄断保护,而不愿意非常主动这么做(我的猜测,微软还是做了一些工作)!事实上,由Novell发起的Mono开源项目就是要将.NET能够在Linux上运行。
(2) 微软最初是希望能够号召天下使用不同语言的所有开发人员汇聚到它的旗帜之下,于是,.NET允许使用各种不同的语言,甚至在符合一定规范的前提下,同一个软件都可能使用多种不同的语言开发(比如同时使用C#和VB.NET)。看上去,这很好,但是会对项目管理等带来一些负面的影响。这是微软以技术手段而引导的一种市场趋势,但我认为并不很成功。Java只有一种语言,就是Java。但是不要认为,在Java平台中不可以有多种语言——理论上,它一样可以。
关于它们各自的特点,我能说的就这么多。具体语言、语法上的,我对Java并不非常了解,没有能力逐一列举。而且,我认为,在这方面的区别或争论完全没有意义。我前面的举的Person的例子中,C#的属性(Property)就一定好吗?不见得,至少表面上,属性不再像是一个方法(也就是函数-Function,或行为-Action),这对于接口的理解可能不利的。
有人问过我:我应该是学习Java还是.NET(或C#)?我们的系统应该是用.NET搭建还是用Java搭建。我的观点是,从技术上,都可以。不要单纯认为Java更加稳定,效率更高,更适合于做大型项目…。也不要单纯认为C#语法简单,结构良好…。除了它们各自的特点,我们还需要考虑的是市场和人为因素。
Java比.NET早出现,相对来说,它更加成熟,并且开源相对多,开发框架也多,选择余地就多。这看上去像是它的优点,其实我不完全这么认为。曾经有测试人员跟我抱怨,他们的测试团队必须要同时熟悉Java的多个开发框架,这给他们造成了很大的压力。
.NET开发框架相对较少,比如ASP.NET MVC出现之前,通常认为就一个开发框架:WebForm(不说其他应用程序类型,比如WinForm、Windows服务等)。所以,很多人——包括我在内——入门门槛相对要低。而且,市场上,对Java开发人员的要求通常要高一些(比如工作经验),这也是导致感觉上.NET入门门槛低的一个因素。我个人认为,这是对Java不太有利的一面。另外,.NET是由微软官方维护的,提供了大量的支持工作,比如MSDN,这大大方便了开发人员的学习和使用,降低了成本,这是.NET的一个优势。当然,我们的Java团队也在不断在这方面努力。
有经验的开发人员,无论用什么技术都能开发出高效率的系统,而初入学的开发人员,可能即便用优秀的技术也仍然会开发出低效的系统。比如Hibernate是Java中一个不错的开发框架,但是用的不好就会一不小心吃掉大量内存,有人就曾经跟我说,他们的系统只有10多个人同时登录就会导致服务器内存被吃掉数百MB,导致系统无法继续下去。
影响我们选择使用何种平台和技术的,通常是开发成本(费用、技术、周期等等)和市场等因素,技术仅仅是一个方面。而关于效率方面,这有时候根本与我们使用何种技术开发无关,而是部署、集群、负载均衡等一系列技术综合的结果。
而且,现在一个完整的解决方案可能会同时使用多种不同的技术,包括C/C++、C#、Java,表现为多种不同的应用程序,包括客户端(比如QQ、杀毒软件)、Web Service、门户网站、内容管理系统等等。