最初, 我是做Java的, 由于项目需要, 我转向了.Net. 这发生在我职业生涯的初期. 从那就朝着.Net的方向走下去了...很长一段时间, 我用对Java的理解来处理C#的问题, 后来发现很多时候这样并不合适, 甚至是错误的, 虽然它们都是面向对象的语言...
在面向对象的世界里, 一切皆是对象.
Java和C#都是面向对象的语言, 它们都遵守面向对象的概念, 这也使得这两种语言很像, 至少看起来是这样. 但在具体实现上, 这两种语言还是有很大差别的.
作为面向对象的语言, Java先于C#面世. 一切皆是对象, Java遵守得很好--所有的类都继承自Object, 一点儿问题没有! 然而同时, Java认识到很多时候我们需要做一些简单计算: 2+3=5、(2==3)=false...这些频繁使用的简单的不能再简单的小东西, 我们有必要封装起来做成一个个对象再去操作它们吗? 回答是, 没有必要! 于是, Java引入了简单类型, 或者叫基本类型, 同时引入了值类型的概念. 换言之, Java的值类型就是这几个简单类型, 而且它们是脱离Object之外的概念, 它们不是面向对象的元素. Java便成了面向对象+boolean、byte、short、int、long、char、float、double这八个简单类型.
值类型是不是面向对象?
Java认为不是的, 它把八个简单类型单拿出来, 虽然小小的牺牲一点儿面向对象的纯度, 但Java相信这个世界会理解它的.
C#没有明说, 但它是这么做的: 引入ValueType类型, 让它继承自Object. 引入struct关键字, 让它表示ValueType类型. 接下来,C#做了更夸张的动作, 把Int32、Long、Boolean...甚至DateTime都定义成struct, 让int和Int32等价、long和Long等价、bool和Boolean等价...之后, C#自豪的声称自己是"纯"面向对象, 这里实在有点儿耍流氓的架势, 因为它完全可以让ValueType不继承Object, 自立门户是极简单的事情嘛.从这个意义上讲, C#比Java更不纯.
面向对象之外
Java更加注重面向对象, 更加注重标准化和完美化. 于是, Java有了Eclipse, 有了JSP、Serverlet、EJB, 有了Spring、Structs、Hibernate...
C#更加注重实用性和易用性, 它封装的更多一些. 于是C#有了VisualStudio, 有了ASP.Net、WinForm App、CommandLine App、WCF、WPF、WF、EntityFramework...
比较而言, Java更开放, 朋友很多; C#更封闭, 但微软很给力.
展望
2010年1月, Oracle收购了Sun, 把MySQL和Java纳入囊中, 让广大开发者不禁对MySQL和Java的前景产生担忧. 短短半年以后, Oracle状告Google Android侵犯Java专利的行为, 更是让全世界大失所望. 好在Oracle消停了, MySQL和Java都维护得很好.
2008年, C#刚兴起的时候, Java已经发展得如火如荼了. 但后来C#一直发展挺快, 向Java借鉴的同时, 也不断创新, 引入自己的新东西, 如:对值类型的大胆改造, 引入Linq、Lumda表达式, 等.
Java和C#都是在发展的. Java计划也将引入Lumda语法, 看来Java也开始放下架子, 和C#相互学习了. 开放还是封闭、依靠社区还是自己开发, Java和C#选择的道路不同, 但都将更强大且易于使用.
总结
Java和C#都是很好的很完美的(略有瑕疵)的面向对象的语言, 很强大, 且用起来也很相像.
从语言的层面上来讲, 由于C#对ValueType的引入和特殊处理, 使得它比Java更复杂一些.
VisualStudio很强大, 这也帮助C#更容易使用. 好多Java开发者认为.Net的开发者是傻瓜型编程, 并依此自认为高人一等. 这里, 我认为是没有必要的: 从config文件里面改配置就比从属性窗口修改更有优越感? 在Panel里new 一个Button, 之后给它设置位置、文本...就比拖动一个Button到Form, 之后拖动控制大小和位置来得更有成就感么? Java和C#各有偏重, 这是大家应该正确认识和包容的.