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表达式又有了新的理解。给出书上的代码和我自己的一些注释~
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#本质论》的更多相关文章
- 日本IT行业劳动力缺口达22万 在日中国留学生迎来就业好时机 2017/07/18 11:25:09
作者:倪亚敏 来源:日本新华侨报 发布时间:2017/07/18 11:25:09 据日本政府提供的数据,日本2018年应届毕业生的“求人倍率”已经达到了1.78倍.换言之,就是100名大学生 ...
- 2021.07.20 P3951 小凯的疑惑(最大公因数,未证)
2021.07.20 P3951 小凯的疑惑(最大公因数,未证) 重点: 1.最大公因数 题意: 求ax+by最大的表示不了的数(a,b给定 x,y非负). 分析: 不会.--2021.07.20 代 ...
- 2021.07.20 CF1477A Nezzar and Board(最大公因数,未证)
2021.07.20 CF1477A Nezzar and Board(最大公因数,未证) CF1477A Nezzar and Board - 洛谷 | 计算机科学教育新生态 (luogu.com. ...
- 2017/05/20 java 基础 随笔
static 关键字的特点 1.随着类的加载而加载 2.优先于对象存在 3.被类的所有对象共享 如果某个成员变量是被所有对象共享的,那么他就应该定义为静态的 4.可以通过类名调用 其实它本身也可以通过 ...
- 2017/11/20 Leetcode 日记
2017/11/14 Leetcode 日记 442. Find All Duplicates in an Array Given an array of integers, 1 ≤ a[i] ≤ n ...
- 2017.9.20 HTML学习总结----下拉列表标签
接上: 1.下拉列表框<option>,<selcct> (1)解释:在表单中,通过option select标记可设计一个下拉式的列表或带有滚动条的列表, 用户可以在列表中选 ...
- 2017.2.20 activiti实战--第五章--用户与组及部署管理(一)用户与组
学习资料:<Activiti实战> 第五章 用户与组及部署管理(一)用户与组 内容概览:讲解activiti中内置的一套用户.组的关系,以及如何通过API添加.删除.查询. 5.1 用户与 ...
- 2017.5.20欢(bei)乐(ju)赛解题报告
预计分数:100+20+50=first 实际分数:20+0+10=gg 水灾(sliker.cpp/c/pas) 1000MS 64MB 大雨应经下了几天雨,却还是没有停的样子.土豪CCY刚从外地 ...
- Cheatsheet: 2013 07.09 ~ 07.20
Mobile How to implement Android Splash Screen Migrating iOS MVC Applications to Windows Phone 8 (M-V ...
- 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 ...
随机推荐
- 从0引入 ASP.NET Identity Core
原文出自Rui Figueiredo的博客,原文链接<ASP.NET Identity Core From Scratch> 译者注:这篇博文发布时正值Asp.Net Core 1.1 时 ...
- Bandit Wargame Level12 Writeup
Level Goal The password for the next level is stored in the file data.txt, which is a hexdump of a f ...
- iOS 通过UIControl,自定义控件
如:自定义一个可以点击的 图文 #import <UIKit/UIKit.h> @interface UD_Button : UIControl @property(nonatomic,s ...
- C++ 头文件系列(stdexcept)
预定义异常类 这个头文件包含的内容非常简单,只包含9个异常类,均从exception类派生,因此我们用三张图来描述: 这里仅解释两点: overflow : 指值的大小超过 整型 变量能表示的范围,即 ...
- n年前,我没钱但年轻,我怕n年后我老时,还是一无所成——2017我的收获和反思
记得当年我刚从学校里出来时,应该和现在的95后差不多,当时还是很惶恐的,怕找不到工作,怕无法挣到足够的钱买房子支撑家庭,(当然还有其它的担心点),却唯独没意识到自己拥有着最宝贵的财富:年轻. 年轻意味 ...
- C# 内存模型
C# 内存模型 This is the first of a two-part series that will tell the long story of the C# memory model. ...
- 转载|chrome developer tool—— 断点调试篇
断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析.也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时 ...
- MySQL在字段中使用select子查询
前几天看别人的代码中看到在字段中使用select子查询的方法,第一次见这种写法,然后研究了一下,记录下来 大概的形式是这样的: select a .*,(select b.another_field ...
- js必须掌握的基础
好多人想要学习前端……自学或者培训那么我们在学习过程中到底需要掌握那些基础知识呢!下面分类了JS中必备的知识也是必须要了解学会的!看一看你是否已经将JS的基础知识都了如指掌了呢? 事件: onmous ...
- 韩顺平教学资源java、oracle、linux
http://blog.itpub.net/28688617/viewspace-766392/