去年年末,終於下決心,買了一本紙質的CLR Via C#,元旦這幾天在家里閉門讀書(3天元旦 + 2天自己的帶薪假期)。
其實,早就在網絡上下載過了電子版的英語的CLR Via C#了,不過,電子書的問題也很明顯,由於是免費的,所以不是很重視,買了紙質的書,自己花了真金白銀,所以格外重視,不能對不起人民幣啊(古人說的,書非借不能讀,其實也說明了這個意思)。加上這樣的書,讀原版是相當痛苦的,還是讀中文的比較靠譜。
去年的11月份,有一篇 【1個月學會C++ 】的博文,引起了罵戰,按照這篇博文的邏輯,CLR一書的作者也可以歸為垃圾了。不過,我想能一直在這里看博文的同志,不是那種只想看電視,而不想知道電視機內部的原理的人吧。這里和CSDN的論壇不一樣,CSDN的論壇,索取的人比較多,項目做到一半,出現了無法解決的問題,自己懶得去Google,然后急急忙忙注冊個賬號,發個有點挑釁的標題,《是高手的,就進來挑戰一下》雲雲,然后就坐等答案。這里的人,更多的是分享,以及對於底層的探索。
NET,屬於入門容易,學好難的東西。我可以說,使用NET寫個HelloWorld,在宇宙第一的IDE幫助下,一個小時就可以了。21天學會C#,也是非常容易的。如果,你的目標只是靠C#找個專做數據查詢,插入,刪除的外包的職位,我覺得,你可以不必花時間學習 CLR 這本書了,有時間的話,考個日語一級什么的比較划算。如果,你有足夠的好奇心,想知道一些CLR內部的原理的話,強烈建議去好好讀讀這本書。
當然,如果你是初學者,不建議一開始就讀這本書,而是建議,先動手寫幾個月的C#,然后積累一些心得體會,或者是一些疑問,然后帶着疑問去讀CLR,這個是最好的了。一些東西,直接把答案放在你面前,缺少你的獨立思考,是沒有辦法完全映入腦子里面去的,過點時間就忘記了。我來說說我以前一直糾結的一些事情吧:
1.大寫的String 和 string 到底有什么區別?(5章 基元數據)
2.Animal t = New Cat(); ,這個時候 t 的方法到底是Animal的,還是Cat?(4章 實方法和虛方法)
3.字符駐留的概念到底是怎么樣子的?(14章 字符)
4.編譯好的EXE文件,在你雙擊了這個文件到打印出HelloWorld之間,到底發生了什么事情?(1-3章,22章AppDomain)
這些答案都可以在CLR一書中找到答案。
這本書的另一個特點是,代碼很規范。例如,以前做一個自定義的控件,要實現一個事件,就定義一個Event在控件里面,然后在父窗體中將委托和處理的Handle使用+=綁定一下就結束了。讀了CLR以后,知道一個標准的Event應該怎么做,什么樣子的才是規范的,比如你需要定義一個EventArgs等等。
比起很多博文里面純文字 + 代碼的解說,這本書里面的圖,也很贊。很多原理,在插圖的幫助下,讓人一下子就記住了。例如在講解
的時候,線程棧,對象堆的圖就很容易理解。講解委托鏈的配圖,也將大家的學習成本降低了很多。
這本書最牛的地方就是,把一些我們司空見慣的東西,從源頭上講明白了,例如一個 event 關鍵字后面,其實包含了一個委托,兩個操作委托鏈的方法。匿名方法,其實編譯器在后台還是把語法糖還原成為了一個新的CompileGenerate(編譯器生成)的類。如果你知道這些東西的話,你的NET水平會增加很多,或者說,能夠突破你的能力的瓶頸,或者,能讓你在技術的論戰中,有足夠的底氣和論據。
如果你有時間,我建議你通讀全書,如果再有時間,希望能夠一頁一頁讀,反反復復的讀。如果你真的很忙,建議,4-19章必須至少讀一遍。
如果有可能的話,把你的感想寫在書得空白處,如果你愛惜書的話,可以使用 N次貼,把讀書筆記貼在上面(我是這樣干的,字寫得不好。。。)。如果能寫在博客上,也是個好主意,寫過一遍的東西,記得更深刻了。
當然,你只是想看電視,不想知道電視機背后的原理,還是學點別的東西比較靠譜。
最后我談談C#和CLR。C#不是CLR的全部,只是一種實現罷了。不要以為C#的標准就是CLR的標准。
例如:CLR的規范是 變量不區分大小寫的.(VB.NET是不區分變量大小寫的,所以公共語言規范是不區分變量大小寫的,不然的話,C#的程序,VB無法使用)
返回值類型不同的方法,可以認為是不同的方法,例如 public int GetSomething() 和 public String GetSomething() 是不一樣的方法。不過除了IL之外,所有的語言都不允許這樣。
和書的作者擔心的一樣,大家將C#慢慢和CLR划等號了,以為C#的規范就是CLR的規范(VBNET,Vber的悲哀),所以有必要把兩者的關系分開來。原本MS希望通過IL層,希望百花齊放,百家爭鳴,不過,看樣子,變成C#一家獨大了,IL的重要性很微妙了(MONO好像也是有自己規范的IL的,不是只做CLR)反正只有C#了,反正各個平台有自己的IL規范,直接C#到Native,效率問題也解決了。