黑马程序员技术交流社区

标题: 请问一下,有属性了还要定义私有字段吗 [打印本页]

作者: 段朝骞    时间: 2013-9-30 01:32
标题: 请问一下,有属性了还要定义私有字段吗
本帖最后由 段朝骞 于 2013-9-30 12:31 编辑

有属性存在了还必须定义私有字段吗?不定义可以不可以?

作者: 274997322    时间: 2013-9-30 04:44
首先你需要明白 属性的本质 实际上是对私有字段封装的两个方法 一个get ,一个set
你表面上没有写私有字段,但实际上,在编译过程中,编译器会自动帮你生成私有字段
  例如:你定义了一个属性  public string StuName{set;get;}
            实际上编译器会帮你生成一个一个私有的stuName字段
由于这个原理,私有字段是必须存在的,但是可以不用程序员来定义。
作者: 曹伟    时间: 2013-9-30 08:44
首先从两者的声明上来看,公共字段只是类用public修饰符所公开的简单公共变量,而属性则是对字段的封装,它使用get和set访问器来控制如何设置或返回字段值。

由于属性的实质是方法(get或set方法),在IL中是没有属性的概念的。所以对于开发过程中常用的赋值和取值操作来说,使用公共变量肯定会比使用属性速度要快,性能上也稍高(方法和变量哪个速度不用说了吧)。

公共字段虽然在速度上快,但它必须开放字段为public,这样一来对象的调用者便可以直接修改其值,值的内容是否合法,运行中是否会出错,就没有了保障,进而会大大降低类的可重用性;相反,属性类似于方法,它可以对存入的变量的值进行处理,如果觉得该值不合法,可以就地变换或者直接提出警告。这对该类的对象的使用安全有很大好处,在运行过程中,因公共变量值的错误而产生的问题会大大减少。

从上述内容来看,两者各有优缺点,在实际项目开发过程中,我们究竟选择使用哪一种方式呢?

如果满足下面几个条件,那么我们便可以大胆地使用公共字段:

1. 允许自由读写;

2. 取值范围只受数据类型约束而无其他任何特定限制;

3. 值的变动不需要引发类中其它任何成员的相应变化;

属性的使用条件则恰好跟变量相反,只要满足下面任何一个条件,就应该使用属性:

1. 要求字段只能读或者只能写;

2. 需要限制字段的取值范围;

3. 在改变一个字段的值的时候希望改变对象的其它一些状态;

总结:虽然在实际项目的开发过程中,公共字段和属性在合适的条件下都可以使用,但是我们应该尽可能的使用属性(property),而不是数据成员(field);把所有的字段都设置为私有字段,如果要暴露它们,则把它们封装成属性,这也是微软推荐的方式。
作者: 段朝骞    时间: 2013-9-30 12:31
谢谢,明白了
最好是封装成属性,不要怕麻烦




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2