efficient

不积跬步,无以至千里,不积小流无以成江海

导航

使用属性代替可访问的成员变量

Posted on 2006-09-04 11:26  efficient  阅读(308)  评论(0)    收藏  举报

在C++中,类里面的成员变量通过public或private修饰符来控制成员的可访问性,而在类的外面通过classname.filedname来直接访问类的成员变量。然而在C#中新增的一大特性就是属性(properties),而且应当鼓励使用属性来代理C、C++中的传统可访问变量的写法。那么为什么要使用属性?使用属性给我们带来那些好处呢?

1.    属性同时具有成员变量和方法的特性

使用属性的一个最大的优点就是他可以在保证访问成员变量的同时具有方法的特性,这可以帮你做许多事情,诸如:校验数据有效性、抛出异常等,原来需要在方法中调用变量所实现的事情,现在属性就可以做到了,这将函数所应实现的功能性逻辑和成员变量所应进行的有效性验证分开处理,而不是全部写成函数,使得代码逻辑更加清晰。其次,由于属性具有方法的一些特性,使得它可以在接口中被定义,使得实现它的类必须定义这些属性,这解决了在接口中只能定义功能逻辑而不能定义数据的限制、使得接口的功能更加强大。

2.    数据绑定代码类只支持属性而不支持成员变量

.net中的数据绑定机制使用反射来找到一个属性,例如:

textBoxCity.DataBindings.Add( "Text", address, "City" );

上面将textBoxCity的Text属性绑定到address对象的City属性,若将这里的Text和City由属性改为成员变量,这段代码将无法运行。

3.    支持多线程、异步同步机制

由于属性包含了方法的特性,使得它对多线程的支持更加简单,可以使用lock来加强数据的同步访问机制,参见以下代码:

4.    实现对象数组的访问-索引器

属性的一种扩展形式便是索引器,通过不同的索引,它可以方便的访问一组对象。

5.   所生成的中间层语言(IL)不同

成员变量和属性虽然都是用于实现对数据的访问,然而他们在内部上确是被分别看作不同的对象来对待的。当属性被编译时,它的get和set实际被看作了函数,被编译器编译成了函数的形式作为中间层语言存在,而在给属性赋值的时候也不是简单的将数据压入栈中,而是首先实例化get或set函数,让后通过函数的调用再给数据赋值的,从这点看来与简单数据的访问还是有很大差别的。