码农乌托邦

楠哥小站

楠哥,理想主义码农,就职于Google,现居西雅图。


《Effective C#》读书笔记(一)

这篇文章是Effective C#第一章的读书笔记,共计11节。作者给出的还是比较简单的建议,整理如下:

  1. 使用C#中的“属性”而不是“私有变量”。这个应该是基本的常识了,类似于在Java编程时,大多数人都推荐写Setter/Getter, 而不是使用域Field。
  2. 使用readonly变量而不是static变量。这两种变量的主要区别在于readonly是运行时常量,而static是编译时常量。从表面上看,const只能支持数字和字符串,而readonly可以支持更多的引用类型;从.NET的内部机制分析,const会在编译时进行替换,IL层会出现多个const值,而readonly会在IL层出现多个引向同一地址的引用。作者更加推荐使用readonly,因为const在效率上的优势很有限,但是readonly在IL层是指向同一地址的多个引用,不会产生很多难以理解的bug。比如在One.dll定义了一个const值,在Two.dll中引用了这个值,如果修改const变量的值之后,同时编译了整个程序,自然不会产生问题,但是如果只对One.dll进行了编译,因为const只是在IL层的值替换,所以Two.dll还会使用旧的值,因此产生错误;而如果使用readonly,因为在Two.dll中是指向One.dll的一个地址,就可以很好的避免类似的问题。
  3. 使用is和as操作符,而不是cast。一方面这两个操作符不会抛出异常,另一方面在效率上有优势。作者还指出,系统默认的
  4. 使用conditional进行条件编译,该关键字在生成的IL层代码中不会产生许多空的CheckState()函数效用,有效率上的优势。
  5. Override系统默认的ToString()方法。在面向对象的编程实践中,ToString()方法的override有过很多讨论,应该也是比较常识性的知识。
  6. 对象的四个Equal方法。Equal在数学上的定义要符合三个条件:自反(a==a),对称(a==b则b==a)和可传递(如果a==b且b==c,则a==c)。C#中的对象中有两个equal方法我们不应该改写:Object.ReferenceEquals()和Object.Equals()。第一个比较的是对象引用的相等性(因为值类型的装箱问题,即使对一个值类型自身进行运算也会得到false的结果),第二个实际上在内部调用了对象本身的Eqauls方法。另外两个是我们常常需要override的方法,Equals和==操作符。作者建议对于自定义的值类型都给出Equals的override,而对于自定义的引用类型则只在必要时给出,这是因为值类型的默认Equals方法中使用了反射,效率并不高。Override一个类的Equals方法还要注意符合数学上的定义,注意检查比较对象的类型。往往我们还需要同时Override类的默认GetHashCode()方法。
  7. 关于GetHashCode()方法,设计了更多的理论知识。一般情况下,只有在自定义的类作为HashMap的Key时,我们才会考虑Override一个类的GetHashCode()方法。对于Override此方法有三条准则:如果想等需要生成相同的HashValue;同一个对象必须总是返回同一个HashValue;所有可能输入产生的HashValue在整数范围内需要呈现随机分布(需不需要呈现均匀分布?还需要再仔细研究一下算法)。并没有一个通用的算法,但是作者提到,经验表明,对所有字段调用GetHashCode()方法后做XOR运算往往能够带到目的。
  8. 推荐使用查询语法和LINQ。这个也是C#易用的一个标志,属于比较常识性的技巧。
  9. 避免在API中使用转换操作符,如果不得已,可以使用构造函数实现。在OOP的实践中,这个也是比较常识性的内容了。
  10. 使用可选参数和具名参数。这项技巧往往不由程序员决定,而是由所在团队的coding guideline决定的,所以在此就不做过多的讨论了。
  11. 使用短小的方法。虽然这也是比较常识性的技巧,但是作者在可读性之外,给出了更加深入的解释。在IL层,.NET会自主决定寄存器和堆栈的安排。而使用短小的方法,可以让程序运行时更容易的进行判断,这样可以潜在的减少堆栈的使用效率,更多的是用寄存器,因为大而复杂的函数在JIT编译器上并不会在程序开始就完成所有IL的翻译。
这11条建议中,2,6,7,11都涉及到了.NET的细节,对于各帮助位大小码农理解.NET有非常好的效果。
最近的文章

王小波是对的

一切痛苦都来自于对自己无能的愤怒。越来越觉得被无数人拿来感慨的句子说的是这么对。总觉得自己努力工作应该得到应有的回报,但是机遇这种东西毕竟不是常常都有的。事实上我是非常幸运的,IT业的蓬勃发展让我少走…

Life继续阅读
更早的文章

《Effective C#》读书笔记(零)

因为工作的原因,现在越来越难抽出时间写技术文章了。曾经看到过一个统计数据,大概是说每个码农平均每年阅读技术书籍的数量小于一本。为此,一方面为了督促自己看书,一方面为了和大家分享心得,从今天开始,我会不…

Technical, Book继续阅读
comments powered by Disqus