第一次接觸《C#本質論》是在這個鏈接。那時候剛學寫C#,而且它的語言風格深深吸引了我,噢對了還有它強大的IDE——VS。這個鏈接里的書確實不錯。文中提到:
雖然這三本書都是外國原著的,但是卻不像其他系列書一樣中文譯版和原版版本相差很大,可以說翻譯工作幾乎同步。
1. 《果殼中的C#》
去年雙十一在亞馬遜看到原版書(第四版)降價,好不容易下單了,等了一個月沒發貨(海外淘)就取消訂單了。在圖書館看過最新的中文版本也就第三版,沒看過沒太多話語權,等下學期預約了這本書(太搶手了!)看看再寫評論。
2. 《精通C#》
這本書我看過第六版的中文本。和大部分國內的C#教程一樣,還是以WinForm作為切入點。這本書很厚,1k頁是妥妥的,但是不同版本厚度不同,我記憶中中文版的第六版比第五版少個一兩百頁。
最讓我受益部分是操作數據庫部分,也是我第一次接觸連接字符串這個概念(其實是我當時需要這一塊的知識,所以印象深刻)。書中關於操作數據庫的篇幅不算多,只能是啟發式。
本書也是三本書里最容易讀懂的,《果殼中的C#》我看過目錄和第一章,還是有難度的;《C#本質論》等下說。這本書如果讀完了,基本上能看懂大部分的C#源碼了。之前在知乎上看過有人問如何學習C#,有個人說自己看完了這本書,不知道下一步該怎么辦?高贊回答是找項目做,並且其他C#入門書可以不用再看了。
對於不是特別牛逼的本科生,除非你接觸了不少C#的項目,不然我是推薦這本書作為入門書和放旁邊隨時查閱。
3. 《C#本質論》
這本書也是我最近看的一本C#知識的書。好不容易找到了一個.NET的實習,但是半年沒寫C#了,所以就借了本C#的書(滿足我的幾點要求:講授C#語法知識,不會特別厚,不從WinForm切入,盡可能地新版本C#5.0或以上)。
先上結論:我個人看來這本的定位不是入門書,而是那些已經有一定的C#代碼開發經驗的人作為身邊的資料查閱書。
前4章還好,講控制流,數據類型什么的,還算是淺顯。第五章開始講類,很多概念沒辨認清楚,而且也拗口,例如看完我還是不知道字段和屬性有什么不同。后面的更加不說了。而且這本書已經涉及了不少CLR和CIL的知識了,這些比較底層,如果沒有一定的開發經驗真的看不懂。有人會說我們可以忽略不懂的部分,但是從新人角度看,怎么忽略?當你設身處境的時候你會發現你根本做不到忽略,很客觀的一個因素是如果內容為1,能看懂的部分不一定超過0.5呢(譯者要背一定的鍋),這怎么可能是一本入門書,只會讓入門者打擊自信。
當然又優點,其實缺點也是優點:如果是那些開發了一定的C#項目,想了解CLR和CIL,但是《CLR via C#》又看不懂,那么《C#本質論》應該可以作為一個跳板,順便還能復習撿漏(書中特別多拓展知識,即使是簡單的語法知識也會拓展,這部分新人不一定能看懂)。我欣賞這本書的一個原因是它不講WinForm,很純粹地講C#,當然這也造成它不同其他入門書那樣容易通讀和理解。
我第一次看這本書看了1/4,發現駕馭不了。第二次,也就是這段時間,看了1/2,看到委托和Lambda表達式,發現很多東西也駕馭不了,打算棄療了。拓展知識實在太多了,很多東西消化不了。而且有些拓展知識講得太細了,例如會跟你拓展一些其他寫法,但是這些寫法在實際開發中哪個王八蛋會用這么操蛋的寫法?還是好好修煉到要接觸CLR和CIL的時候再看這本書吧~
當然了,有些知識點這本書解釋得不錯,例如委托!這三天看了不少委托的例子,唯一讓我入腦的是一篇以“一切都是對象”的觀點來解釋的帖子,之前分享過。大致就是說C#里的委托和現實中的委托是一樣的,你委托為別人做一件事,你和別人都是對象,做的這件事你沒必要會,別人會的話,你委托別人做就好。有人會說可以在自己的類里申明別人的類,然后調用別人的方法也可以做到。是的,問題是,如果你委托很多人做事呢?這個問題在此不深究,等我真的理解了再另寫帖子。
《C#本質論》里解釋委托用的是冒泡排序,正常下升序和降序是寫死了。如果說調用者希望指定升降序,則要寫兩個一模一樣的函數。第一個解決方法是多傳入一個參數接收升降序的標志,然后再比較相鄰兩元素前判斷標志來執行對應的條件表達式。這么做也有問題,因為只照顧了兩種排序,如果是字典排序呢?或者根本就不是簡單的值類型排序呢?如果此時還用上面的方法那豈不是很累贅?因此這時我們可以換一種思路,傳進來的那個升降序標志不再是我們所理解的一個值,而是一種能比較的方法!即排序這個方法委托它來完成“比較”這件事。循循善誘還引出了lambda表達式的用途!讓我對委托和lambda表達式又有了新的理解。給出書上的代碼和我自己的一些注釋~
1 class DelegateSample 2 { 3 // 聲明嵌套的委托數據類型 4 public delegate bool ComparisonHandler(int first, int second); 5 6 public static void BubbleSort(int[] items, ComparisonHandler comparisonMethod) 7 { 8 int i; 9 int j; 10 int temp; 11 12 if(comparisonMethod == null) 13 { 14 throw new ArgumentNullException("comparisonMethod"); 15 } 16 17 if(items == null) 18 { 19 return; 20 } 21 22 for (i = items.Length - 1; i >= 0; i--) 23 { 24 for (j = 1; j <= i; j++) 25 { 26 if (comparisonMethod(items[j - 1], items[j])) 27 { 28 temp = items[j - 1]; 29 items[j - 1] = items[j]; 30 items[j] = temp; 31 } 32 } 33 } 34 } 35 36 //兼容上面聲明委托的一個方法:注意到它的簽名:同返回值,同參數列表 37 public static bool GreaterThan(int first, int second) 38 { 39 return first > second; 40 } 41 42 43 static void Main() 44 { 45 int i; 46 int[] items = new int[5]; 47 48 for (i = 0; i < items.Length; i++) 49 { 50 Console.Write("Enter an integer: "); 51 items[i] = int.Parse(Console.ReadLine()); 52 } 53 54 BubbleSort(items, GreaterThan); 55 //BubbleSort(items, (first, second)=> { return first < second; }); 56 //注意到上面的那個方法聲明比主體還長!所以就有了簡潔的Lambda表達式! 57 58 for (i = 0; i < items.Length; i++) 59 { 60 Console.WriteLine(items[i]); 61 } 62 } 63 }
《C#本質論》里不缺乏這種用簡單的例子解釋一個很好概念。我想着就是多看書的原因之一,不同作者對同一個事物的理解不同,總有人的理解能讓你茅塞頓開。
那么,期待下次再見,《C#本質論》。
2017-07-20 Thursday
不再用Markdown語法寫博客園文章了,發現博客園對Markdown的渲染效果並不好。