相同中的不同:Java程序员应该停止低看C#

发表于:2011-5-25 09:32

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:贾隆译    来源:51Testing软件测试网采编

#
java

  我们建立的开发网站kalistick算是个Java专营店了,从一开始的第一版起,全部产品使用的都是Java代码,但我们并不偏执,从2008年开始,我们也开始分析和使用C#。我注意到Java开发者大都在看待C#的时候多少带些轻蔑,就好像这是一只微软仿造的山寨猫,蠢人和软蛋们才会用它。我在博客中开始清除这些观念和误解,展示C#的种种好处。

  Java和C#的相同之处比不同处要多得多:两种语言都是写在大括号里的,就像C和C++,类型都是静态、强类型和显式形态,两种语言都是基于类的面向对象语言,两者用的都是运行时编译的思路,并且很好的使用了垃圾处理。

  所以这篇文章里,我要重点谈谈它们的相同点,以及C#的巧妙之处。

  统一类型系统(Unified type system)

  在Java中,原始数据类型(byte、int、bool、float、char等)和其他的类不同,它们并不算是面向对象,也不和引用类型共享相同的祖先类,但它们是有自己的包装类的,用来代表自己并且用来插入到对象结构中(例如int使用Integer类),这样做可以提高性能。

  在另一边,C#的统一类型系统却都是从一个公用的根类型System.Object类中衍生而来的,即使是原始数据类型。所有的数据都要用到对象方法(ToString、Equal、GetHashCode等),所以你会碰上像3.ToString()这样的表达式,这种把方法混合到后缀,就带来了dsl风格的语句:

TimeSpan workingTime = 7.Hours() + 30.Minutes();

  这么做的美妙之处在于当开发者把数据类型当做值来使用时,它们能够和Java的原始类型一样高效,只有在想要把它们当做对象使用时,系统才需要使用boxing/unboxing来分配堆内存。

  显式虚方法(Explicit virtual method)

  在Java中,默认所有的方法都是虚方法(虽然这些方法可以使用final封装起来而不允许覆盖),而C#则不同,如果想在C#中写一个虚方法,必须先要用virtual关键字显式声明一下。

  有几种原因决定了这样的选择,首先是性能上的考虑:虚方法都有一个悬在头上的性能问题,因为它们不是正常的内联,需要通过vtable来进行调用,这种做法并不直接(Sun的JVM可以内联上最经常调用的虚方法)。第二个也是更重要的原因就是版本问题:C#的设计思路是向后兼容,因此不同版本类库中的基类和衍生类是可以进化发展和保持兼容的。例如,C#能够完全支持基类中新加入的成员和衍生类中的成员同名,而不会导致无法预料的错误。最后一点是可读性:开发者的编程意图能够非常明显的读出来。在Java中,如果开发者不写出Override annotation的话,你不会知道他到底是不是想要重写这个方法。

  1. class Meme 
  2. public virtual void Spread() {} 
  3. class ThreeHundred : Meme 
  4. public override void Spread() 
  5. Console.Write("This is sparta!"); 
  6. class Dbz: Meme 
  7. // Not a method override 
  8. public void Spread() 
  9. Console.Write("It's over nine thousaaannnd!"); 
  10. }

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号