日期:2014-05-17  浏览次数:21003 次

那些年,我们应该读的书 《Effective_C#_中文版_改善C#程序的50种方法》第一章

刚看完第一章,写了点笔记:

原则1:始终能的使用属性(property),而不是可直接访问的Data Member
Thinking :在类里最好不要提供公共变量。公开的只是属性。优点:可以对变量进行类似方法一样的多样性操作。(如,传值的判断、接口化等)

原则2:为你的常量选择readonly而不是const
Thinking :Const(编译常量,仅限于数字和字符串)比readonly(运行常量) 的变量编译速度快。但是仅可能的选择使用 static readonly来声明一个变量。优点:static readonly可以赋任何类型的值、用赋值方法初始化值,多个类有多个不同的值。

原则3:选择is或者as操作符而不是做强制类型转换
Thinking :as(o as MyType 如果转换不了会出现一个NULL值,如果转换值类型将不会出现Null值),is(if (o is int))。As 不能转换值类型,is可以对任何类型判断。如果使用强制类型转换会出现异常,必须try{}catch{}

原则4:用条件属性而不是#if
Thinking :#if这东西没有用过哦,只有在网上先查查看是如何用的。Conditional这种方法比起#if/#endif块它对条件编译阐述的更清晰。Conditional特性应用于方法级,所以它迫使你把所有条件型代码一一写到相应的方法中。#define也可以不用写在using前,可以在项目-属性-Build-“条件编译符号”内写下符号。
预处理识别以下指令识别以下指令:
#define #undef #if #elif  #else  #endif #error  #warning #line #region #endregion
#pragma warning disable       #pragma warning restore
#if #elif  #else  #endif 指令可以完成,使用#define指令来定义一些指导预处理器修改原代码的符号的工作。
 
使用条件编译的实例:
 #define MACRO1
 using System;
 public class Program
 public static void Main()
   #if (MACRO1)       console.writeline("MACRO1 is defined.");
   #elif (MACRO2)       console.writeline("MACRO2 is defined and MACRO1 is not defined");
   #else               console.writeline("MACRO2  and MACRO1 are both defined");
   #endif
如果用vs,会看到开发环境将不编译的代码显示为灰色。符号常量必须在using指令之前定义

何时使用:
你在调试的时候,需要输出结果来确定程序是否正确,但在发布的时候不需要输出这些结果。或者程序在某一版本发布了一个试用的功能,但在下一版本中要暂时去掉这个功能,就可以这个条件来控制。
使用Conditional元数据Attribute来实现代码调试

原则5:始终提供ToString()
Thinking :重写ToString()是为了有可有效的提示。

原则6:区别值类型数据和引用类型数据
Thinking :做为菜鸟的我对值与引用类型并不是太关心(在开发中对功能的实现影响不大,可能是菜鸟的原因吧)。看了这节后我只记住了:值类型不具备多态性,但它们在你的应用程序对数据的存取却是性能更佳;引用类型可以有多态性,并且你还可以在你的应用程序中为它们定义一些表现行为。用class说明的类型一定是引用类型,用struct说明的是值类型。

原则7:选择恒定的原子值类型数据
Thinking :看了此小节,不是太懂。依稀记得,一个类中的字段有点多时,且如果某个字段改变了,为影响到别的字段时,这时候不是要考虑一下把字段定义为readonly,再加入一个方法或是构造函数来对这此字段进行管理。

原则8:确保0对于值类型数据是有效的
Thinking :本小节,大概是在讲如果你要定义一个枚举时,可以传个0进去,但这个0可以是默认的也可以是返回错误的提示,不要用异常来处理(有点像你在写构造函数后又要重构时,可以允许用户传null值进来,构造函数中对这个NULL值进行处理,而不用异常来处理)。推理,那类中的字段也要用get,set来处理为NULL的值。

原则9:明白几个相等运算之间的关系
Thinking : 决不应该重载静态的Object.ReferenceEquals()和静态的Object.Equals(),因为它们提供了正确的检测。应该重载引用类型实例的Equals()。曾在一个项目中看见一个同事在类中重载了Equals(),当时不清楚为什么要这么做,今天看了这一个小节才知道他的做法有效的。例,我在做项目时常会用到当接收到一个实例时,要判断这个实例与我现有的实例列表中的是否相同时,如果类中重载了一个Equals()那就方便了,因为实例中总是有好多个值要比较,代码简洁了。

原则10:明白GetHashCode()的缺陷

Thinking : 说实在的GetHashCode()在开发过的项目中没有用过,本小节也没有看到懂,差距啊~~~

原则11:选择foreach循环
Thinking : 说实在的foreach 与for对任何一个程序员来说使用的次数一定对你参加的宴会要多。今天看了这一节才知道,Loop 2比Loop 3效率要高(在C#里,我用FOR时一直是用的LOOP3)。本节还告诉我们foreach比for效率高。Foreach用了你想做的好多事,比如数组的上下限、类型的匹配等,如果用for这些你还要判断,我一直认为我写的代码一定没有MS的天才们写的好。以后还是多用foreach吧。
// Loop 2:
for (int index = 0;  index < foo.Length;  index++)
  Console.WriteLine(foo[index].ToString());
// Loop 3:
int len = foo.Length;
for (int index = 0;  index < len;  index++)
  Console.WriteLine(foo[index].ToString());

如果你有想看这本书了,那就去下吧http://download.csdn.net/detail/daihongliu/4605841是doc格式的。

下载的评论:

hpzhou1984
好书,排版很不错,内容很给力。我都差点就在当当上买了
fangmiya7258
在网上找了好久找到了。DOC版本的,不容易啊,大多数都是EXE版本的,只能坐在电脑边看。
不要开玩笑了,大家都这么忙了,那有那么多时间是坐