網上這方面的比較文章已經有不少了,不過大都是要么從很高的角度說的,要么就是從底層說的,本人就以自己這幾年的編程經歷中的感受,來談談自己的體會。
相似性:
Java和C#都是一門面向對象的語言,Java更多地借鑒了C++的優點,而摒棄了它的一些不太容易被人掌握的知識點(有些不能說是缺點),并且增加了一些自己的特點,而C#則是更多地借鑒了Java的優點,而增加了一些自己的特點。
個人猜測,在Java語言出現之前,C++被廣泛使用,而且被認為容易使用,Java如此類似于C++,致使人們更容易接受;而現在Java是最廣泛使用的,C#如此接近Java,則更容易吸引Java開發人員(僅僅是猜測)。也就是說Java站在C++的肩膀上,而C#站在了Java的肩膀上。
?
跨平臺特性
跨平臺特性的最大優點就是只要有相應的運行環境,同一個編譯好的程序就能在上面運行,而不需要重新編譯程序,它的缺點就是不能針對特定平臺,所以不能充分利用平臺特性,因而在性能上會有所降低,幸運的是現在的硬件比以前大大提高,這部分的降低在絕大部分情況下可以不用考慮。而且Java和C#都有自動垃圾回收機制,運行時環境可以自動清理不再使用的內存,減少了手動釋放內存的風險。
Java的跨平臺特性建立在可以跨越多個不同種類的操作系統平臺,比如Windows、Linux、Unix等,但是需要注意的是不是說Java能在所有的系統上都能跨平臺,必須實現在該操作系統上的Java運行時環境JRE才行,也就是說假如今天有人開發了一個前所未有的系統,這時候Java程序是不能在上面運行的——因為還沒有針對這個操作系統的Java虛擬機(JVM),好在在當今絕大部分操作系統上都有針對該系統的JVM,所以它能“一次編譯,到處運行”。
C#的跨平臺則是建立跨Windows平臺的基礎上的(有一個針對非Windows的.net運行環境,不過好像還不是太好),不像以前Windows95下的程序到WindowsXP下就不能運行,或者WindowsXP下的程序到Windows95下也不能運行(這種情況居多),現在呢,只要安裝一個.net framework(也就是.net程序的運行時環境),在Windows2003下編寫的.net程序不用重新編譯就能在Windows98下運行,只要這臺安裝Windows98的機子安裝了.net程序的運行時環境。
這一個回合Java勝出。
?
語法特性
Java拋棄了指針,使用了包(package)的概念,導入包使用import語句,在Java中有幾種非面向對象的數據類型,那就是byte、char、short、int、long、float、double這幾種數據類型,在方法中傳遞時僅僅是傳遞它們的值,為了方便一些集合類的操作(它們存儲的是對象類型),又增加了它們的包裝類Byte、Char、Short、Integer、Long、Float、Double。
在Java中存在屬性的概念,這些都是通過setXXX()、getXXX()來設置。
?
C#沒有完全拋棄指針(在unsafe狀態下還可以操作指針),對于類的管理采用了名稱空間(namespace)的概念,并且還使用了out、ref等關鍵字,便于從一個方法返回多個結果,在C#中不僅存在屬性,還有索引器等比較方便的特性。
?
生成文檔doc文檔
在利用程序中的特殊注釋生成api文檔方面,兩種語言都有不錯的表現,不過C#更勝一籌,它能利用注釋在輸入類成員時提示,便于程序員不用去看程序源碼而知道程序的大概用途,而Java這方面沒有。
?
IDE(集成開發環境)方面
Java的IDE是非常多,從龐大的Jbuilder到小巧的Jcreator,還有可以擴充的Eclipse,可以說Java的IDE的數量是非常多的。
?
C#的IDE不多,除了微軟自己的VS.NET之外,好像還有Borland的C#Builder,除此之外,廣為認知好像不多。
?
性能方面
Java采用了字節碼(bytecode),而C#則采用了MSIL,它們的性能都是介于解釋型語言和生成本地機器代碼之間的,在本人的測試中,C#的性能略高于Java,可能Java的字節碼要適用多個系統多個平臺的緣故吧。
?
企業開發方面
由于Java出現的時間長的緣故,并且還能跨平臺,采用EJB等解決方案,所以目前絕大部分網站都是基于J2EE開發的(大部分都是J2EE+MySQL+Apache+Linux,都是免費的)。
?
C#做的大型網站,它也有針對EJB的Net Remoting技術,由于它限制了必須(IIS+Windows),所以大型的網站不是太多,不過隨著時間的推移,可能會有更多的網站采用asp.net技術。畢竟微軟的東西一向傻瓜化,門檻低,能夠吸引一些初級編程人員到這個行列中來。而且微軟的asp.net采用了代碼和頁面分離技術,的確能方便編程人員。
?
總結:
記得有一句話,大意是這樣的,Linux就像專業相機,拍攝出來的照片取決于你的攝影技術;而Windows就像傻瓜相機,只要會按快門就能拍照。我覺得Java就像Linux,添加一個按鈕,一個標簽都需要你指定樣式,放置到哪里也需要你指定;而C#則繼續秉承了Windows的特點,傻瓜化,便于操作,便于上手。
補充一點:好像搞Java的同等情況下比C#的高,可能是物以稀為貴吧:)。?