2017-07-20聊聊《C#本質論》


第一次接觸《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的渲染效果並不好。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM