第一次接触《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表达式又有了新的理解。给出书上的代码和我自己的一些注释~

     class DelegateSample
{
// 声明嵌套的委托数据类型
public delegate bool ComparisonHandler(int first, int second); public static void BubbleSort(int[] items, ComparisonHandler comparisonMethod)
{
int i;
int j;
int temp; if(comparisonMethod == null)
{
throw new ArgumentNullException("comparisonMethod");
} if(items == null)
{
return;
} for (i = items.Length - ; i >= ; i--)
{
for (j = ; j <= i; j++)
{
if (comparisonMethod(items[j - ], items[j]))
{
temp = items[j - ];
items[j - ] = items[j];
items[j] = temp;
}
}
}
} //兼容上面声明委托的一个方法:注意到它的签名:同返回值,同参数列表
public static bool GreaterThan(int first, int second)
{
return first > second;
} static void Main()
{
int i;
int[] items = new int[]; for (i = ; i < items.Length; i++)
{
Console.Write("Enter an integer: ");
items[i] = int.Parse(Console.ReadLine());
} BubbleSort(items, GreaterThan);
//BubbleSort(items, (first, second)=> { return first < second; });
//注意到上面的那个方法声明比主体还长!所以就有了简洁的Lambda表达式! for (i = ; i < items.Length; i++)
{
Console.WriteLine(items[i]);
}
}
}

《C#本质论》里不缺乏这种用简单的例子解释一个很好概念。我想着就是多看书的原因之一,不同作者对同一个事物的理解不同,总有人的理解能让你茅塞顿开。

那么,期待下次再见,《C#本质论》。

2017-07-20 Thursday

不再用Markdown语法写博客园文章了,发现博客园对Markdown的渲染效果并不好。

2017-07-20聊聊《C#本质论》的更多相关文章

  1. 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09

    作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09     据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...

  2. 2021.07.20 P3951 小凯的疑惑(最大公因数,未证)

    2021.07.20 P3951 小凯的疑惑(最大公因数,未证) 重点: 1.最大公因数 题意: 求ax+by最大的表示不了的数(a,b给定 x,y非负). 分析: 不会.--2021.07.20 代 ...

  3. 2021.07.20 CF1477A Nezzar and Board(最大公因数,未证)

    2021.07.20 CF1477A Nezzar and Board(最大公因数,未证) CF1477A Nezzar and Board - 洛谷 | 计算机科学教育新生态 (luogu.com. ...

  4. 2017/05/20 java 基础 随笔

    static 关键字的特点 1.随着类的加载而加载 2.优先于对象存在 3.被类的所有对象共享 如果某个成员变量是被所有对象共享的,那么他就应该定义为静态的 4.可以通过类名调用 其实它本身也可以通过 ...

  5. 2017/11/20 Leetcode 日记

    2017/11/14 Leetcode 日记 442. Find All Duplicates in an Array Given an array of integers, 1 ≤ a[i] ≤ n ...

  6. 2017.9.20 HTML学习总结----下拉列表标签

    接上: 1.下拉列表框<option>,<selcct> (1)解释:在表单中,通过option select标记可设计一个下拉式的列表或带有滚动条的列表, 用户可以在列表中选 ...

  7. 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组

    学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...

  8. 2017.5.20欢(bei)乐(ju)赛解题报告

    预计分数:100+20+50=first 实际分数:20+0+10=gg 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地 ...

  9. Cheatsheet: 2013 07.09 ~ 07.20

    Mobile How to implement Android Splash Screen Migrating iOS MVC Applications to Windows Phone 8 (M-V ...

  10. Cheatsheet: 2013 06.23 ~ 06.30, Farewell GoogleReader(2008.07.20~2013.06.30)

    Mobile Resources for Mac and iOS Developers- Introduction to Objective-C Modules Other 10 Principles ...

随机推荐

  1. Golang开发环境搭建(Notepad++、LiteIDE两种方式以及martini框架使用)

    本文介绍两种Golang的开发环境一种基于notepad++.还有一种基于liteide. 1.下载Golang语言的pkg:http://golangtc.com/download 直接点击安装,一 ...

  2. Vboxmanage改动uuid报错的解决的方法

    我的环境: Virtualbox 4.3.10 r93012 操作系统:win7 问题:Virtualbox在使用拷贝的虚拟盘时会提示uuid冲突: Because a hard disk with ...

  3. this问题

    this问题 弹出层是一种很常见的页面显示部件,利用require js的模块化可以使部分功能组件重用性更高.以弹出层为例,探讨关于this的问题 首先来看这样一段代码 Html部分代码 <bo ...

  4. Java中File的使用

    File 代表文件或者目录的类 构造函数 File(File parent,String child)---代表了指定父目录下的指定的子文件或者子目录 File(String pathname)--- ...

  5. Java面向对象的特征

    面向对象的特征 封装.继承.多态.(有人问第四个特征,再加抽象) 封装 体现形式(2种) 函数---提高代码的复用性 属性的私有化---将属性设置为私有的,通过提供对外的访问方法来间接操作对应属性,可 ...

  6. JS中数组的迭代方法和归并方法

    昨天总结的JavaScript中的数组Array方法 数组的迭代方法 ES5中为数组定义了5个迭代方法.每个方法都要接收两个参数:要在每一项上面运行的函数和(可选的)运行该函数的作用域对象---影响t ...

  7. python爬虫小结1

    先看正则化,正则化就是描述命令和字符切分.查找.筛选等功能的方便方式. http://www.cnblogs.com/fnng/archive/2013/05/20/3089816.html 一个游戏 ...

  8. 插值查找C++

    和上一篇折半查找很类似,只有四则运算不一样,思想类似. 只是在插值查找的过程中,考虑了查找键的值. #include <iostream> using namespace std; //需 ...

  9. JDK8.0新特性

    连接转载地址:http://www.2cto.com/kf/201609/544044.html Eclipse: http://aiyiupload.oss-cn-beijing.aliyuncs. ...

  10. dd 命令详解

    作用: dd 是一个Unix和类Unix系统中的命令, 主要功能为转换和赋值文件.在Unix和类Unix系统上, 硬件的设备驱动(如硬盘) 和特殊设备文件(如/dev/zero, /dev/rando ...