C#更接近於人的思惟習慣

  我一個同窗說過「沒有JDK文檔的狀況下,我無法寫Java,可是沒有MSDN的狀況下,我照樣寫.Net的程序。」這話我十分贊同。由於Java太混亂了,不少不夠合理的地方,沒有文檔的話,不少你想找的類,你不知道該去哪一個包裏找。而C#更接近於人的思惟習慣。html

  說一個我跟別人說過不少次的例子。java

  ---程序員

  你要在代碼中獲取系統當前時間。你會去哪裏找?至少個人第一想法是去Date類、Time類或者DateTime類裏找。我在Java裏找了很久,最後發如今Calendar類裏。。。安全

  並且Java下,這個從Calendar類獲取的系統時間,要轉化成Date、Time之類的東西才能在別處用,但是,印象中要從Date、Time類型的變量中提取int類型的小時、分鐘神馬的值,很麻煩,反而獲取從19xx年1月1號開始的毫秒數很容易。但問題是,我得到這玩意以後能夠幹嗎?用它比較時間前後卻是不錯。服務器

  可是在C#下,你直接去DateTime類裏,就能找到。DateTime類裏有個屬性叫Now。並且C#的DateTime類,能夠很方便的獲取小時、分鐘什麼的。函數

  ---.net

  並且C#中能夠重載運算符,直接用大於號、小於號就能夠比較時間前後,用==就能夠比較字符串。視頻

  而Java裏比較字符串非得用.equals(),很糾結呀。htm

  對於那些不習慣用==比較字符串的Java程序員,你在C#裏也仍然可使用.equals()。索引

  ---

  記得有人跟我講過這樣一個事:微軟專門請過1000個程序員,給他們n小時,寫一個讀寫文件的程序。結束以後,通過微軟統計發現,這1000人裏大部分人首先想到去找File這個類。因而微軟就在它的C#裏,把File作成了個靜態類,專門提供各類用於讀寫文件的方法。

  ---

  泛型這東西是C#首先支持的。泛型這東西,能夠大大下降強制轉換的次數,下降錯誤轉換的可能性。而Java彷佛在JavaSE1.5(有多是1.6,記不清了)纔開始支持泛型。因此你在寫Java的時候,有些第三方jar包,爲了兼容這以前的java版本,裏面的方法給你返回的是object類型的東西,須要你手動轉換。

  ---

  C#下的枚舉也比Java安全。Java裏面的枚舉直接用int強制轉換過去就行,你甚至能夠在不知道一個int在枚舉中意味着什麼,就把它做爲參數傳進去。而C#裏的枚舉是強類型,不能隨意轉換。

  ---

  C#下有不少用來下降程序員由於馬虎出錯的可能性的東西。

  好比參數的ref、in、out標記。

  加了in標記的參數,你在函數裏就無法對它進行賦值了。防止程序員錯誤的向變量寫入東西,下降bug率。並且在後期維護程序的時候,負責維護的程序員看到in標記以後,就知道這個函數不管怎麼改,這個參數不要動。

  而加了out標記的參數,系統就會容許調用者傳未賦值的變量進來。可是,無論這個參數傳進來的時候有沒有被賦值,系統會要求你首先對這個變量進行賦值才能使用。就是說,變量裏任何已經存在的值你是無法使用的,必需要覆蓋掉。並且若是方法裏存在一個代碼路徑沒有對這個參數進行賦值,系統會報錯。這個也能夠下降bug數量。

  加了ref標記的參數,對於引用類型的東西,好比類的實例,這個ref標記加不加沒有區別。可是對於值類型的參數,好比int、結構體等,就能夠以傳引用的方式調用了。

  ---

  C#下,集合操做遠遠比Java方便。尤爲是有了泛型。

  C#下,幾乎全部集合類型均可以轉換成IEnumerable類型,IEnumerable能夠用ToList()方法轉換爲List,並且均可以用foreach來遍歷。Java裏,List是抽象類,我最初接觸Java的時候,找了很久都不知道爲何new List()會出錯。。。最後才知道要new HashSet()

  C#下的Linq、Lambda表達式能夠很方便的對集合查詢。

  ---

  C#的好多集合類型、Collection類型,均可以用索引器。好比List類型的strList,咱們能夠直接strList[i]來獲取第i個元素。Dictionary類型的someDict,咱們能夠直接用someDict[someKey]來獲取某Key對應的Value。

  ---

  C#裏的屬性是個化繁爲簡的好東西。

  Java裏爲了寫一個JavaBean,你須要爲每一個屬性寫一個千篇一概的getXXX()和setXXX方法,而在C#裏你能夠簡單的寫String someProperty{get;set;}就行。get和set也能夠單獨限定private、public等限定符。也能夠自定義get和set訪問器,以便在須要的時候進行一些關聯操做。好比在set的時候能夠調用OnSet之類的事件委託。

  ---

  委託,這個也是一個極好的特性。

  記得寫Java的桌面應用的時候,一個類要實現MouseListener接口,而後在處理函數裏判斷

  if(被單擊的是Button1)

  {/*Do something*/}

  else if(被單擊的事Button2)

  {/*Do something*/}

  ......

  若是窗口上的button多一些,這個函數可能要幾百行,並且代碼亂的不得了。可是若是是C#,能夠爲每一個button的click事件指定不一樣的處理函數,代碼清晰簡潔。

  在IoC的實踐中,C#的委託也比Java的傳接口的實例更爲有優點。

  ---

  C#下,反射比Java更易用。

  並且C#裏的MEF也是個不錯的東西。咱們團隊以前用MEF開發了一個東西,每一個模塊徹底解耦合,徹底不須要知道其它模塊的信息,只須要知道核心組件裏的接口就能夠調別的組件了。這樣作到了在不影響其它模塊的狀況下,直接替換某組件。而核心組件正是經過MEF,以反射的方式發現組件並動態加載組件。

  ---

  「約定優於配置」的理念

  以前看MSDN的WebCast,講Asp.netMVC2的那集,裏面有句話我印象特別深「約定優於配置」。

  裏面的講師開了個玩笑「你的項目裏要是沒有50個配置文件,每一個配置文件沒有100行,你都很差意思跟別人說你寫了個Java項目」。這句話固然誇張了,不過Java裏面須要配置文件的地方的確很多。就拿Struts2.0和Asp.netMVC來比較。Struts2.0裏你須要些配置文件告訴服務器,哪一個是Controller,哪一個是View,哪一個是Model。可是Asp.netMVC裏就很清楚了,裏面Controller文件夾裏的XxxController文件就是名爲Xxx的Controller,View文件夾裏、Model文件夾裏也是如此。視頻的講師當時說了一句「Controller文件夾裏放的固然是Controller了,難道你真的要在View文件夾裏建立一個文件名是XxxModel的Controller麼?你有這個需求麼?」

  瞭解更多請點擊:鄭州最好的牛皮癬醫院

  鄭州最好的白癜風醫院

  鄭州白癜風醫院

  河南白癜風醫院

相關文章
相關標籤/搜索