《Effective C#》
Item1:Always Use Properties Instead of Accessible Data Members
尽可能使用属性而不是数据成员。原因非常简单,因为属性是类的外部接口,而数据成员为类的内部实现,使用属性对内部成员进行封装,并添加额外的功能,譬如赋值前检查、设置为只读等等,也更能符合OO的要求,毕竟把内部数据成员直接暴露给外界是十分危险的的事情。
可能使用VS2003的朋友会觉得写起来有些麻烦,但2005中己经有封装字段的功能,能帮我们省不少事,所以还是能使用属性就使用属性吧。
最后再加一点我个人看法,这一点也不是太绝对,在一些非常小的,也不会改动的小工程中,直接使用内部成员也未尝不可,尽管使用属性会在JIT编绎时以Inline处理,性能上基本没有损失,但属性必竟是当作函数调用的,而且使用属性和内部成员两者成生的IL代码量相差也不少。
Item2:Prefer readonly to const
这个没什么好说的,如果决定使用常量,而且该常量能在编绎时确定,就使用const,如果是在运行时确定的,就使用readonly.只是要注意编绎时常量在编绎后会被替换成该常量的实际值,这可能会给以后的程序升级带来影响。
Item3: Prefer the is or as Operators to Casts (is or as 优于强制转换)
类型转换,一个老话题,一个在编程中应尽量避免但又可不能完全避免的问题,每种语言都有相应的类型转换的操作符,c#也不例外,对于基元类型有Convert class,对于引用类型,其提供了is 和 as关键字。(注 is 也可用于值类型,但as只可用于引用类型或nullable类型)。这条主要是说对于引用类型的类型转换,is or as 要优于强制转换,主要原因是使用is or as类型转换(注:准确的讲 as 才算是类型转换操作符,is仅能判断类型,不能进行类型转换)不会抛InvalidCastException,从而我们也不需要在程序中做相应的try...catch处理,当类型转换符as转换不成功时会返回null,我们只需对其返回结果进行检查即可。
as or is使用起来要注意一点,就是其不会调用用户自己定义的类型转换方法,它可以调用的方法为编绎时确定的类型所提供的方法。