Bill Wagner先生的《Effective C#》一书保持作者一贯的风格,很值得我们一读。很早就想把读此书的感想写出来,一直没有时间,最近总算比较轻闲,借此写出读此书的心得,水平有限,希望对大家有所帮助
Item 1: Always Use Properties Instead of Accessible Data Members 第一项:永远使用属性而不要直接访问数据成员
说到属性,大家肯定都知道。 比如:
class Person { 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个方法内的代码直接编译到调用它们的方法中,从而消除调用方法时的运行负担,但它的代价时编译后的方法代码 变得比较庞大。由于属性的访问器方法通常含有比较少的代码,所以内联它们会使代码变得更小,执行效率更高!
|
请发表评论