前两期地址:
本期话题:
1:使用属性还是字段
首先重大区别就是属性实质是方法,所以:
1)可以为属性添加代码;
2)可以让属性支持线程安全;见effective c#第一版的第一章;
3)属性得到了VS编辑器的支持,得以实现自动属性这种功能。
4)自动属性的特点在LINQ中得到了广泛应用,尤其是匿名类型中,只能实现只读的自动属性,匿名类型不支持字段;
5)从设计的角度,也就是面向对象的角度,建议使用属性;
6)如果某个属性仅仅作为类型内部使用,而且不涉及到上面5点内容,则建议使用字段
还有一点,属性在序列化中有点尴尬,由于属性是方法,所以不能为其指定[NonSerialized]特性。
2:利用泛型拓宽方法的应用范围
假设存在方法:
|
然后像下面这样使用它:
|
注意,几个主要类的代码:
interface ISalary<T> class BaseSalaryCounter<T> : ISalary<T> class Employee |
运行结果是:
无法从“ConsoleApplication4.ISalary<ConsoleApplication4.Programmer>”转换为“ConsoleApplication4.ISalary<ConsoleApplication4.Employee>”
显然我们认为PrintSalary方法因为能支持ISalary<Employee> ,所以肯定能支持ISalary<Programmer>,这是一种很容易犯的尝试错误。
改进方法先提供一种思路,就是将该方法改成泛型。
3:利用协变关键字out
要解决话题2中的问题,还可以使用out关键字。即修改接口为:
|
4:减少使用类型的静态变量
1)静态变量一旦被创建不被释放;
2)静态变量不是线程安全的,它不像类型变量只对创建类型的那个线程有效;