关于.Net中属性的使用探讨(一)
codeprince http://tangyong.net@163.com
一.VB.Net中的属性
在使用面向对象思想设计类的时候,尤其当使用.Net开发时,我们经常想对客户代码显示数据,而又同时保证在类中表示数据的封装性。
在这种情况下,属性是理想的解决方案。属性的行为如同类中的数据块。类的用户可以直接访问属性的名称。效果等价于这个类中真正地包
含一个具有这个名称的数据项。在具体地实现中,get属性过程获取属性值;set属性过程设置属性值。.Net Framework中的公共语言规范
(CLS)支持两种不同的属性:
●标量属性
标量属性表示单个值。这个值可以是一个简单的值,如Char或String,或是较复杂的值,如DateTime等用户自定义的类型对象。
●索引属性
索引属性表示值的集合。客户代码使用数组语法来访问集合里的值。
文章的后面将详细地讨论这两种属性。但要记住:属性是.Net Framework中的一个标准特征。这就意味着用任何与CLS兼容的语言开发的程
序代码都可以使用在VB.Net的类中定义的属性。
一个实际的例子:
下面显示了City类的一个简单的属性CityName。
Class City
private mCityName as String
public Property CityName() as String
Get
return mCityName
End Get
Set(ByVal Value as String)
mCityName=Value
End Set
End Property
End Class
二.标量属性
上面的一个例子显示的就是标量属性。在上面的例子中要注意以下几点:
⑴ City类有一个字段mCityName,它保存城市名,这个字段声名为Private(私有),来阻止客户代码的访问。面向对象开发的最重要的
目的就是保持类的封装。换句话说:不要声名Public字段。
⑵ City类有一个属性CityName,用来获取和设置城市名。这个属性作为mCityName的包装器。CityName属性被声名为Public,这样它
可以用在客户的代码中。大多数属性趋向于Public,因为属性本质上是为类提供一个方便的公有接口。不过也可能出现Private和
Protected属性的情况。
⑶ 在定义CityName属性的时候,通过在Porperty语句的末尾附加语法As String来显示指定CityName的属性类型,这是一个良好的编程
习惯;但是在实际的编程中(比如我)在输入完CityName()之后按下回车键,系统也将自动地添加一段Get和Set的语法段,但是系统就
在Property语句的末尾将不附加As String。即如果你省略了返回类型,默认的返回类型是Object(这是系统的最基础的类,所有的
Class(包括用户自定义的类)都要继承于Object)。Set属性过程需要用一个参数,来指定新的属性值。参数的类型必须和属性相同。该
参数必须被定义为ByVal,这表示参数的值通过值传递而不是通过传引用的方式。
⑷ CityName属性在定义时被定义了Get和Set过程,但实际中有很多的属性(包括城市名)可能只是需要访问而不需要设置新的值,那么我们
可以省略Set属性,并对Property使用ReadOnly关键字,就像下面显示的:
Public ReadOnly Property CityName() as String
Get
return mCityName
End Get
End Property
当然有时我们也可以使用WriteOnly关键字,那么这个属性就是可写的。但是只写属性在实际设计中相对较少。
⑸ 在定义属性的时候我们也要注意属性的命名方式(尽管这在设计过程中并不是最重要的),一个好的命名方式能够使你在设计过程中享受快
乐,但定义属性的命名方式比区分大小写的语言(如C#等)要难的多,我个人喜欢为字段设置mXXX(如mCityName),将属性设置为XXX
(如CityName),选择什么并不重要,根据个人的喜好而定。