最初, 我是做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#各有偏重, 這是大家應該正確認識和包容的.