属性是对现实世界中实体特征的抽象,提供了对类或对象性质的访问。类属性描述了一种状态信息,在类的某个实例中,属性的值表示该对象的状态值。属性和字段是密切相关的,属性是字段的扩展,两者都是具有关联类型的命名成员,而且对两者进行访问的语法格式也是相同的。
但是,属性不表示存储位置,这和字段是不同的。在使用属性时,可以通过访问器指定当它们的值被读取或写入时需执行的语句。属性提供了一种机制,可以把读取和写入对象的某些性质与一些操作关联起来,甚至还可以对此类性质进行计算。属性的声明格式如下:
其中,修饰符是可选的,最为常用的就是访问修饰符,也可以使用static修饰符。
当属性声明包含static修饰符时,则被称为静态属性。当不存在static修饰符时,则被称为实例属性。具体说明如下。
1)静态属性不与特定实例相关联,因此在静态属性的访问器内引用this会导致编译错误。
2)实例属性与类的一个给定实例相关联,并且可以在属性的访问器内通过this来访问该实例。
属性的类型可以是任何的预定义或者自定义类型。属性名是一种标识符,命名规则与字段相同。
C#中的属性通过get和set访问器来对属性的值进行读写。get和set访问器分别用关键字get和set,以及位于一对大括号内的代码块构成。代码块内的代码用于分别指定调用相应访问器时需执行的语句块。
实例27:输出类成员的操作结果
下面通过一个具体的实例来说使用属性的流程。本实例保存在“光盘:\daima\8”文件夹内,项目名为shiyongshuxing。实例的功能是输出类成员的操作结果,实现文件的主要代码如下:
上述实例代码的设计流程如下。
1)定义类mm。
2)分别定义两个读写属性kuan和gao,并设置返回参数。(www.xing528.com)
3)定义一个public属性Mianji,赋值为参数kuan和gao的积。
4)分别定义两个构造函数。
5)分别创建对象实例rect和rect1,并对参数进行赋值。
6)根据所赋的对应参数值,输出各参数值。
上述实例代码执行后,将各参数值输出显示,如图8-8所示。
图8-8 实例执行结果
在上述实例中,定义了一个mm类,其高和宽都被定义为protected字段,这样既保证了数据隐藏,又能满足继承它的子类的需要。为了获取并设置高和宽的值,分别定义了两个读写属性Height和Width。mm还包含一个只读属性mianji来读取面积值。面积是通过高和宽计算得到的,但是不能被赋值,因此使用只读属性,以避免错误赋值。
在Height和Width的set访问器中检查了所赋的值是否合理,如果高和宽的值不合理,则会输出指定的提示。由此可以看出,属性的引用方法与字段完全一样,因此使用非常方便。但是应该牢记的是,属性本质上是方法,而不是数据成员。
多学一招
get和set访问器是可选的,在使用时必须注意如下四点。
1)get访问器相当于一个具有属性类型返回值的无参数方法。除了作为赋值的目标,当在表达式中引用属性时,将调用该属性的get访问器以计算该属性的值。get访问器体必须用return语句来返回,并且所有的return语句都必须返回一个可隐式转换为属性类型的表达式。
2)set访问器相当于一个具有单个属性类型值参数和void返回类型的方法。set访问器的隐式参数始终命名为value。当一个属性作为赋值的目标,或者作为运算操作数值被引用时,就会调用set访问器,所传递的参数将提供新值。
3)不允许set访问器体中的return语句指定表达式。由于set访问器隐式具有名为value的参数,因此在set访问器中不能自定义使用名称为value的局部变量或常量。
4)由于属性的set访问器中可以包含大量的语句,因此可以对赋予的值进行检查,如果值不安全或者不符合要求,就可以进行提示。这样就可以避免因为给类的数据成员设置了错误的值而导致的错误。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。