首页 > 代码库 > 2017-07-20聊聊《C#本质论》

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的渲染效果并不好。

2017-07-20聊聊《C#本质论》