去年年末,终于下决心,买了一本纸质的CLR Via C#,元旦这几天在家里闭门读书(3天元旦 + 2天自己的带薪假期)。
其实,早就在网络上下载过了电子版的英语的CLR Via C#了,不过,电子书的问题也很明显,由于是免费的,所以不是很重视,买了纸质的书,自己花了真金白银,所以格外重视,不能对不起人民币啊(古人说的,书非借不能读,其实也说明了这个意思)。加上这样的书,读原版是相当痛苦的,还是读中文的比较靠谱。
去年的11月份,有一篇 【1个月学会C++ 】的博文,引起了骂战,按照这篇博文的逻辑,CLR一书的作者也可以归为垃圾了。不过,我想能一直在这里看博文的同志,不是那种只想看电视,而不想知道电视机内部的原理的人吧。这里和CSDN的论坛不一样,CSDN的论坛,索取的人比较多,项目做到一半,出现了无法解决的问题,自己懒得去Google,然后急急忙忙注册个账号,发个有点挑衅的标题,《是高手的,就进来挑战一下》云云,然后就坐等答案。这里的人,更多的是分享,以及对于底层的探索。
NET,属于入门容易,学好难的东西。我可以说,使用NET写个HelloWorld,在宇宙第一的IDE帮助下,一个小时就可以了。21天学会C#,也是非常容易的。如果,你的目标只是靠C#找个专做数据查询,插入,删除的外包的职位,我觉得,你可以不必花时间学习 CLR 这本书了,有时间的话,考个日语一级什么的比较划算。如果,你有足够的好奇心,想知道一些CLR内部的原理的话,强烈建议去好好读读这本书。
当然,如果你是初学者,不建议一开始就读这本书,而是建议,先动手写几个月的C#,然后积累一些心得体会,或者是一些疑问,然后带着疑问去读CLR,这个是最好的了。一些东西,直接把答案放在你面前,缺少你的独立思考,是没有办法完全映入脑子里面去的,过点时间就忘记了。我来说说我以前一直纠结的一些事情吧:
1.大写的String 和 string 到底有什么区别?(5章 基元数据)
2.Animal t = New Cat(); ,这个时候 t 的方法到底是Animal的,还是Cat?(4章 实方法和虚方法)
3.字符驻留的概念到底是怎么样子的?(14章 字符)
4.编译好的EXE文件,在你双击了这个文件到打印出HelloWorld之间,到底发生了什么事情?(1-3章,22章AppDomain)
这些答案都可以在CLR一书中找到答案。
这本书的另一个特点是,代码很规范。例如,以前做一个自定义的控件,要实现一个事件,就定义一个Event在控件里面,然后在父窗体中将委托和处理的Handle使用+=绑定一下就结束了。读了CLR以后,知道一个标准的Event应该怎么做,什么样子的才是规范的,比如你需要定义一个EventArgs等等。
比起很多博文里面纯文字 + 代码的解说,这本书里面的图,也很赞。很多原理,在插图的帮助下,让人一下子就记住了。例如在讲解
的时候,线程栈,对象堆的图就很容易理解。讲解委托链的配图,也将大家的学习成本降低了很多。
这本书最牛的地方就是,把一些我们司空见惯的东西,从源头上讲明白了,例如一个 event 关键字后面,其实包含了一个委托,两个操作委托链的方法。匿名方法,其实编译器在后台还是把语法糖还原成为了一个新的CompileGenerate(编译器生成)的类。如果你知道这些东西的话,你的NET水平会增加很多,或者说,能够突破你的能力的瓶颈,或者,能让你在技术的论战中,有足够的底气和论据。
如果你有时间,我建议你通读全书,如果再有时间,希望能够一页一页读,反反复复的读。如果你真的很忙,建议,4-19章必须至少读一遍。
如果有可能的话,把你的感想写在书得空白处,如果你爱惜书的话,可以使用 N次贴,把读书笔记贴在上面(我是这样干的,字写得不好。。。)。如果能写在博客上,也是个好主意,写过一遍的东西,记得更深刻了。
当然,你只是想看电视,不想知道电视机背后的原理,还是学点别的东西比较靠谱。
最后我谈谈C#和CLR。C#不是CLR的全部,只是一种实现罢了。不要以为C#的标准就是CLR的标准。
例如:CLR的规范是 变量不区分大小写的.(VB.NET是不区分变量大小写的,所以公共语言规范是不区分变量大小写的,不然的话,C#的程序,VB无法使用)
返回值类型不同的方法,可以认为是不同的方法,例如 public int GetSomething() 和 public String GetSomething() 是不一样的方法。不过除了IL之外,所有的语言都不允许这样。
和书的作者担心的一样,大家将C#慢慢和CLR划等号了,以为C#的规范就是CLR的规范(VBNET,Vber的悲哀),所以有必要把两者的关系分开来。原本MS希望通过IL层,希望百花齐放,百家争鸣,不过,看样子,变成C#一家独大了,IL的重要性很微妙了(MONO好像也是有自己规范的IL的,不是只做CLR)反正只有C#了,反正各个平台有自己的IL规范,直接C#到Native,效率问题也解决了。