Property 过程
更新:2007 年 11 月
属性过程是操作模块、类或结构上的自定义属性的一系列 Visual Basic 语句。Property 过程也称为“属性访问器”。
Visual Basic 提供了以下属性过程:
Get 过程返回属性值。在表达式中访问属性时将调用此过程。
Set 过程将属性设置为某个值,包括对象引用。将一个值赋给属性时,它将被调用。
通常 Property 过程使用 Get 和 Set 语句成对定义,但是如果该属性为只读 (Get 语句) 或只写 (Set 语句 (Visual Basic)),则可以独立定义过程。
可以定义类、结构和模块中的属性。默认情况下,属性为 Public,这意味着在可以访问该属性的容器的应用程序中,可以从任何位置调用它们。
有关属性和变量的比较,请参见 Visual Basic 中属性和变量的差异。
声明语法
属性本身由包含在 Property 语句 和 End Property 语句中的代码块定义。在此块的内部,每个 Property 过程均以内部块的形式出现,它包含在声明语句(Get 或 Set)和匹配的 End 声明中。
声明属性及其过程的语法如下所示:
[Default] [modifiers] Property propertyname[(parameterlist)] As datatype
[accesslevel] Get
' Statements of the Get procedure.
' The following statement returns expression as the property's value.
Return expression
End Get
[accesslevel] Set[(ByVal newvalue As datatype)]
' Statements of the Set procedure.
' The following statement assigns newvalue as the property's value.
lvalue = newvalue
End Set
End Property
modifiers 可以指定访问级别、与重载、重写、共享、隐藏操作相关的信息,以及属性是只读还是只写。Get 或 Set 过程上的 accesslevel 可以是比为属性本身指定的访问级别限制更高的任何级别。有关更多信息,请参见 Property 语句。
数据类型
属性的数据类型和主要访问级别在 Property 语句中定义,而不是在 Property 过程中定义。属性只能有一种数据类型。例如,不能定义属性存储 Decimal 值而检索 Double 值。
访问级别
但是,可以为属性定义主要访问级别,以及在一个 Property 过程中进一步限制该访问级别。例如,可以定义一个 Public 属性,然后定义一个 Private Set 过程。Get 过程保持为 Public。只能在一个 Property 过程中更改访问级别,并且只能使其比主要访问级别限制更高。有关更多信息,请参见 如何:声明具有混合访问级别的属性。
参数声明
声明每个参数的方法与声明 Sub 过程 的方法相同,但传递机制必须是 ByVal。
参数列表中每个参数的语法如下所示:
[Optional] ByVal [ParamArray] parametername As datatype
如果该参数是可选的,也必须提供默认值作为声明的一部分。指定默认值的语法如下所示:
Optional ByVal parametername As datatype = defaultvalue
属性值
在 Get 过程中,返回值作为属性值提供给调用表达式。
在 Set 过程中,新的属性值被传递到 Set 语句的参数。如果显式声明一个参数,则必须将其声明为与该属性相同的数据类型。如果不声明参数,编译器将使用隐式参数 Value 来表示赋给属性的新值。
调用语法
通过引用属性,可以隐式调用 Property 过程。除了必须提供所有非可选参数的值,以及必须用括号将参数列表括起来以外,使用属性名的方法与使用变量名一样。如果未提供任何参数,则也可以选择省略括号。
隐式调用 Set 过程的语法如下所示:
propertyname[(argumentlist)] = expression
隐式调用 Get 过程的语法如下所示:
lvalue = propertyname[(argumentlist)]
Do While (propertyname[(argumentlist)] > expression)
声明与调用阐释
下面的属性将一个全名存储为两个组成全名的名称(名字和姓氏)。当调用代码读取 fullName 时,Get 过程将姓名的两个组成部分组合在一起,并返回全名。当调用代码赋予一个新的全名时,Set 过程尝试将其分割为姓名的两个组成部分。如果它没有找到空格,则将其存储为名字。
Dim firstName, lastName As String
Property fullName() As String
Get
If lastName = "" Then
Return firstName
Else
Return firstName & " " & lastName
End If
End Get
Set(ByVal Value As String)
Dim space As Integer = Value.IndexOf(" ")
If space < 0 Then
firstName = Value
lastName = ""
Else
firstName = Value.Substring(0, space)
lastName = Value.Substring(space + 1)
End If
End Set
End Property
下面的示例演示了对 fullName Property 过程的典型调用。
fullName = "MyFirstName MyLastName"
MsgBox(fullName)