Effective C# 读书笔记 第一章
原则一:
尽可能的使用属性(property),而不是数据成员(field)。
Always use properties intead of accessible data member.
原因:
1.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不被支持的内容。
2.数据安全性检测;在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决,千万不要设置默认值,这是很危险的事情
3.线程同步 对实例的属性可以进行线程同步,而与访问者无关
4.属性可以是抽象的,而数据成员不能是抽象的,这为我们设计出兼容性更强,扩展性更强的类提供了好的解决方案。
原则二:
为你的常量选择readonly而不是const
readonly称为运行时常量
const称为编译时常量
比较:
1.编译时常量只能是基本类型 枚举或者是字符串,如果是引用类型则其值必须设为null。 对于运行时常量无此限制。
2.编译时常量在定义是赋值。 运行时常量在定义时赋值,或者在构造函数里赋值。
3.编译时常量自身有静态的属性,所以不能再用static进行修饰。 运行时常量可以用static修饰,也可以不用static。
4.编译时常量在编译时被替换到code里了,运行时常量是在运行时去读取常量的值。所以如果改了const,那么所有的code都要重新编译。
5.编译时常量性能更好一些。
尽可能的使用属性(property),而不是数据成员(field)。
Always use properties intead of accessible data member.
原因:
1.Net对属性的支持远远大于对成员的支持,你可以对属性进行数据绑定,设计时说明等很多数据成员不被支持的内容。
2.数据安全性检测;在对数据检测时,如果发现数据不满足条件,最好以抛出异常的形式来解决,千万不要设置默认值,这是很危险的事情
3.线程同步 对实例的属性可以进行线程同步,而与访问者无关
4.属性可以是抽象的,而数据成员不能是抽象的,这为我们设计出兼容性更强,扩展性更强的类提供了好的解决方案。
5.属性可以以接口的形式表现。接口里不能定义数据成员,这在一定程度上限制我们的设计。请用属性来解决这个问题吧。
6.基于属性的索引。索引器是C#语法的特殊内容,而索引器正是通过属性来完成的,如果你想为你的类添加一个索引器,除了用属性你还能用什么呢?
7.最后一点,也是比较重要的。不要直接把公共成员转化成属性。
Code
原则二:
为你的常量选择readonly而不是const
readonly称为运行时常量
const称为编译时常量
比较:
1.编译时常量只能是基本类型 枚举或者是字符串,如果是引用类型则其值必须设为null。 对于运行时常量无此限制。
2.编译时常量在定义是赋值。 运行时常量在定义时赋值,或者在构造函数里赋值。
3.编译时常量自身有静态的属性,所以不能再用static进行修饰。 运行时常量可以用static修饰,也可以不用static。
4.编译时常量在编译时被替换到code里了,运行时常量是在运行时去读取常量的值。所以如果改了const,那么所有的code都要重新编译。
5.编译时常量性能更好一些。