《Effective C#》读书笔记(1)
Item 1: Always Use Properties Instead of Accessible Data Members
第一项:永远使用属性而不要直接访问数据成员
说到属性,大家肯定都知道。
比如:
{
private string name;
public string Name
{
get { return this.name;}
set { this.name=value;}
}
}
具体属性能给我们带来什么好处呢?为什么必须使用属性来访问而不直接使用public来访问呢?这些肯定是大家最想知道的。
在本Item中,介绍了使用属性可以为我们带来以下的好处。
1、对赋值进行校验或者其他的处理。
2、遵守封装原则。
3、便于做线程同步访问。
4、支持虚属性、抽象属性,并且可以在接口中使用。
5、在C#2.0中,属性的get,set方法将支持不同的访问权限。
那我们为什么要使代码复杂话来使用属性,而不直接使用public来访问,这样不是简单的多吗?不少人都有这样的疑惑。让我们来
看看通过属性访问和public来访问有什么区别。
首先来看看使用public访问,当我们建立类的实例后,这时将会为public的字段分配动态内存。
而通过属性访问,在定义1个属性的时候,编译器会在生成的托管模块中产生以下3项:
·1个表示属性的get访问器的方法,只有定义了get访问器方法才会创建
·1个表示属性的set访问器的方法,只有定义了set访问器方法才会创建
·1个位于托管模块元数据中的属性定义。
在我们使用属性的时候,Get and Set都被标注为hidebysig, specialname。也就是说它们不能被C#源代码直接调用,它们也不是正是的类
型定义。你只能通过Property来访问它们。JIT编译器会将属性访问的代码进行内联(inline)处理,这样使用属性时就不会再有运行时的性
能损失(相对与字段访问来讲)。但要注意的是,只有对那些执行时间比较短的操作我们才应该使用属性,而对于执行时间长的就应该使
用方法。
PS:内联是指将1个方法内的代码直接编译到调用它们的方法中,从而消除调用方法时的运行负担,但它的代价时编译后的方法代码
变得比较庞大。由于属性的访问器方法通常含有比较少的代码,所以内联它们会使代码变得更小,执行效率更高!