客觀評價C#的優點和缺點

對於C#,coder中可以分為2類:一類是C#死忠,對它讚賞到極點;另一類剛好相反,對它極度排斥。

本文將以全面、客觀的方式評價這門語言,特別是語法方面。


其實很多人評價一門語言是帶著一種感情色彩的。有些人支持C#是因為他只會C#,或者因為他是微軟的老用戶。但更多的人支持C#,是因為他通過比較發現C#確實比其它語言做的好的多。如果將C#和C++,java比較。多個事實證明,在語法上C#確實比C++和Java做的好。下文將會詳細分析好在哪。如果將C#和python, js之類的語言做比較,則會發現C#非常繁瑣,還無法真正跨平台。所以很多人覺得C#不是優秀的語言。這是不對的,因為C#和python做的事情是不一樣的,將它們進行比較毫無意義。就像電子郵件和簡訊進行比較----毫無疑問,簡訊更方便使用----但它們的功能不一樣,不能僅僅因為簡訊更方便就完全否定電子郵件。


C#優點1: 相比java,有更先進的語法體系

由於C#是後生,所以其很多語法都是其它語言的改進。作為一個商業產品,C++用戶是C#的首要目標,所以它充分照顧到了C++用戶的習慣。從整體看,C#語法比java更優雅。這裡java粉絲就可能會站出來,說java也有好的地方----對的,我沒說C#在任何地方都優於java,請不要舉出局部上的反例----C#和java比較的文章比比皆是,這裡就不再重複了。

C#團隊在設計語法時充分照顧到了常見的業務需求,而不是單純的技術層面上的紙上談兵。於是,C#支持事件、委託、屬性、Linq等一系列讓業務開發更簡單的功能。


C# 優點2:強大的周邊

C#的IDE功能非常強大,C#的文檔有包含中文的多國語言,C#所需要的運行平台在用戶量極大的windows上內置。一切的一切都在向我們訴說,C#有一個強大的爹。同時也說明,C#不僅僅是一個語言,更是一個極具匠心的產品。所以,用戶可以享受到這個產品的各個功能----包括售後服務。


以上2個優點就是C#的全部優點了。我想任何一個C#粉絲想證明C#優秀,無外乎上面兩個理由。下面讓我們更來研究它的缺點。


C#缺點1:它是一個產品

作為微軟的產品,它不能幫助競爭者----其它操作系統。作為微軟的產品,它必須追求穩定、嚴謹,而不要出現任何錯誤。

C#團隊實力確實非常強大,導致C#不會出現任何一個低級錯誤,就連 if(a = false) 這樣的代碼都會出現一個警告。C#的語法、底層庫也無時不刻在印證一個理念:我們做的是產品,我們必須保證產品根據我們所期望的工作,而不允許出現任何錯誤。

這是一個優點,也是一個缺點。

當我們的需求和產品設計者所期望的一致時,事情會變的非常輕鬆。但如果需求和期望不同時,麻煩事情會接踵而至。 舉個例子,當我們希望switch能夠貫穿case時,就會出現麻煩----產品設計者不允許用戶直接這麼做----雖然他有合適的理由,也提供了實現這個功能的替代方法,但用戶必須按他說的做。如果這種情況發生在其它產品設計者未考慮到的需求時,那麼這個麻煩將會更大。比如當我們想要重載>>來模擬C++代碼時,就會發現這是一個不可能的任務。

很多人都有這種感受,直接使用IDE自帶的功能開發,做起來非常輕鬆。但一旦有一種自主的想法時,就很難實現----比如修改軟體主題。


C#缺點2:沒有考慮代碼量

這種問題之所以會出現,是因為微軟人多----人家不在乎。在C#中,文檔注釋需求書寫xml,但是文檔注釋卻是不能繼承的----用戶必須手動為每個函數和重載添加註釋。C#的很多常用的工具類因為其使用的局限性(如菜鳥用了就會出錯)而不被公開。典型的例子如下:

public string GetValue(int index) { if(index < 0) throw new ArgumentOutOfromRangeException(); if(index > this.Count) throw new ArgumentOutOfromRangeException(); return GetValueInternal(index);}internal string GetValueInternal(int index) { //...}

C#把用戶當成傻子----GetValue 會傳遞一個非法的index,然後自己則使用更高效的GetValueInternal 。C#系統庫的設計通過對 index 檢測,來確保拋出的是一個符合意義的異常。

那用戶怎麼辦?如果在項目中,不檢測 index 是否合法,則顯得不嚴謹,代碼質量低(不檢查 index,會導致 index 錯誤時將出現 IndexOfRangeException,而不是 ArgumentOutOfRangeException,這會讓第三方用戶迷惑:到底應該捕獲哪個異常)。而檢測則是在浪費代碼量,一個函數尚且如此,一個項目可見一斑。

此外,用戶經常需要使用一個類來實現功能,但其實這個類在系統庫中是存在的,但由於它只是一個內部使用的功能模塊所以不是 public 。這時用戶只好另起爐灶。這也不難解釋為了明明有 Buffer.Copy 這個方法,系統內部卻只會調用 Buffer.CopyInternal(不是public的) 而不是 Buffer.Copy ,而 Buffer.CopyInternal 卻是用戶真正所需要的函數。


總體看,C#不適合做項目。它是一個很大的坑,因為它會通過各種方式消耗用戶的時間。特別是追求完美的人,想要緊跟微軟的節奏創造完美,那簡直是在拿時間開玩笑。而對於僅僅想做完項目的人,也會越做越煩:明明簡單的事情要搞這麼複雜。

即使如此,C#終究也只是一個語言,一個工具。客觀評價一個工具的好壞沒有實際意義,關鍵看用戶能否熟練使用,並且揚長避短。沒有最好的語言,但有最適合自己的語言。


推薦閱讀:

搬運個台灣論壇關於對我們網路流行語的評價
如何評價張學良?
12星座回味上段戀情如何評價,再見時已是陌生人~~
請問如何看待大話西遊之愛你一萬年?
周恩來:耐人尋味的評價認同

TAG:缺點 | 優點 | 客觀 | 評價 |