这是一个几乎所有面向对象编程书里都会谈到的话题。用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#中是一等公民,提供了非常强大的功能,设计类时要用属性来替代可访问的数据的成员。