8
6
2015
0

[Effective C#] Item 1: Use Properties Instead of Accessible Data Members


这是一个几乎所有面向对象编程书里都会谈到的话题。用C#中的属性(或在其他OO语言中使用的getter和setter方法)来包装要公开的数据成员,即所谓的数据隐藏。


这是一个很值得讨论的话题,因为有很多人觉得这么做没有必要。不过嘛,我也说不过他们,就在这里简单地说几个属性的优点吧。

1. 最显然的一个优点:可以在对字段赋值前做值的有效性检查,例如,代表一个人的年龄的属性必须是非负的。

2. 在WPF/Silverlight中,控件的数据绑定使用的是属性。MS没有为公共字段提供数据绑定的支持。

3. 可以很轻松得为属性添加多线程同步的支持。

4. 相比于getter和setter方法,用户代码对属性的操作方式几乎和公共字段一样,非常方便。

5. 如果只需要包装数据而不提供附加的功能,属性的声明和字段一样方便。

注意,也不用声明那个私有的age字段。

6. 属性可以对字段的可访问性进行更好的控制,可以对两个访问器使用不同的可访问性修饰符,或干脆不实现其中一个,以实现只读、只写之类的功能。

7. 只要方法有的功能,属性也有,因为属性本质上就是两个方法拼在了一起。属性的两个访问器可以被继承,可以声明为virtual、abstract,可以声明在interface里面,可以使用泛型的类型参数。

8. 在调试时若要追踪一个属性,只需要关注它的两个访问器就行了,而如果是公共字段,则要找到所有可能修改该它的代码。

9. 可以用带参数的属性来使用索引访问数据


当然,属性的使用也有一些要注意的地方。

1. 不要刚开始声明一个公共变量,后来再用属性代替它。尽管两者在代码上完全一样,但是由编译器生成的IL却完全不同,属性的访问本质上是方法调用。如果做了这样的修改,必须重新编译所有的用户代码。

2. 在用户代码看来使用属性就是在访问数据,所以不要在属性的访问器里做需要较长时间来执行的操作。


总得来说嘛,属性在C#中是一等公民,提供了非常强大的功能,设计类时要用属性来替代可访问的数据的成员。

Category: C#及OOP | Tags: Effective C# | Read Count: 354

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com