JAVA程序員看C#的精華與糟粕

轉載一篇,以後研究C#時可能用得上。

 

 

C#和java是號稱90%的相同加上10%的不同。因此當時我學習C#,閱讀兩種代碼完全沒有什麼阻礙。

對C#瞭解得深入以後,來發表下對這兩種語言各自特性的一些看法

比較起java和C#大相徑庭的那10%,會發現C#五花八門的特性要多很多。比較知名的有:委託,屬性,真正的泛型,索引器,類初始化器,分部類,操作符重載,struct,unsafe代碼,IDisposable等,另外.net framework 3.5還加了一大串純粹由編譯器提供的特性。

 

委託,這個可以算是C#之於java的最大優勢。雖然java可以依靠接口,匿名內部類這些特性實現委託一樣的功能,但卻要麻煩許多,如果涉及到N個委託實例相加的情況,那麼一個C#裏面簡單的"+"號,在java裏就只能用FilterChain,InterceptorStack這種概念了。

 

屬性據說屬性信息是帶到運行時的,後查看反射的確有PropertyInfo類,之前說它是編譯器語法糖是受了某篇分析IL代碼的文章誤導,不過這個是不是語法糖都沒什麼關係,它和java普遍做法的get,set各有優劣。屬性寫起來簡捷,但卻比較難看出哪些屬性是隻讀,哪些是隻寫不讀。

 

真正的泛型,這個又是一大C#的優勢,同時僞泛型又是java的一大敗筆。但是java年代比較長,爲兼容性考慮不得不使用假的泛型實現。如果泛型不是在jdk1.5時推出,而是在jdk1.4,和collection framework一起推出,我認爲它也會採用真正的泛型實現。

 

索引器,有了這個很多容器類都可以直接用[]取元素,感覺還不錯,比沒有好,編譯器的小把戲。

 

類初始化器,典型的懶漢特性。每次用頂多能省下一兩行代碼,又是編譯器的小把戲。

 

分部類(partial class),純粹爲了vs.net的那一大堆圖形化設計器老和人的代碼衝突而搞出來得玩意,又是編譯器的小把戲。

 

操作符重載,屬於用到得不多,要用時卻顯得特別有用的東西,很奇怪java爲什麼不提供這個功能。

 

struct,在堆棧上的東西,釋放內存那是超級的快,只不過需要用到這個的場合,大概都在使用C++編程。

 

unsafe代碼,純粹增加語言複雜性的東西。就好像一個人搬家,看這個不捨得扔,那個也不捨得扔,搞到最後把瓶瓶罐罐都搬走了。

 

IDisposable,實現這個接口,配合using塊,非常的強大,終於可以像C++那樣掌握對象的銷燬了。

 

接着說說java比C#多的特性:

匿名內部類:真是極端方便的一個東西,還和JAVA的好多設計模式有關係,不過C#把java匿名內部類的寫法拿去用作類初始化器了,糟蹋了...

 

動態代理: java裏面要實現AOP,易如反掌;C#要實現AOP,難如登天,不得不借助Assamble命名空間下的那些動態IL生成工具。這就是動態代理的作用。

 

希望有一天C#可以擁有匿名內部類和動態代理,變得更完善。也希望java也可以有委託等。

發佈了24 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章