Property 过程 (Visual Basic)

Property 过程是一系列 Visual Basic 语句,这些语句处理模块、类或结构上的自定义属性。 Property 过程也称为属性访问器。

Visual Basic 提供以下 Property 过程:

  • Get 过程返回属性的值。 访问表达式中的属性时,将调用它。
  • Set 过程将属性设置为值,其中包括对象引用。 向属性赋值时,将调用它。

通常使用 GetSet 语句以成对的方式定义 Property 过程,但如果属性是只读的(Get 语句)或只写的(Set 语句),则可单独定义任一过程。

使用自动实现的属性时,可省略 GetSet 过程。 有关详细信息,请参阅自动实现的属性

可以在类、结构和模块中定义属性。 属性默认为 Public,这意味着可以从应用程序中可访问属性容器的任何位置调用它们。

有关属性和变量的比较,请参阅 Visual Basic 中属性和变量的差异

声明语法

属性本身用包含在 Property 语句End Property 语句中的代码块来定义。 在此块内,每个 Property 过程显示为包含在声明语句(GetSet)和匹配的 End 声明中的内部块。

声明属性及其过程的语法如下所示:

[Default] [Modifiers] Property PropertyName[(ParameterList)] [As DataType]
    [AccessLevel] Get
        ' Statements of the Get procedure.
        ' The following statement returns an 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
' - or -
[Default] [Modifiers] Property PropertyName [(ParameterList)] [As DataType]

Modifiers 可指定访问级别以及有关重载、重写、共享和隐藏的信息,还可指定属性是只读还是只写。 GetSet 过程中的 AccessLevel 可以是比为属性本身指定的访问级别更严格的任何级别。 有关详细信息,请参阅 Property 语句

数据类型

属性的数据类型和主体访问级别在 Property 语句中定义,而不是在 Property 过程内定义。 属性只能有一种数据类型。 例如,不能定义属性来存储 Decimal 值但检索 Double 值。

访问级别

但是,你可以定义属性的主体访问级别,并在它其中的一个 Property 过程中进一步限制访问级别。 例如,可以定义 Public 属性,然后定义 Private Set 过程。 Get 过程仍为 Public。 只能在属性其中的一个过程中更改访问级别,并且只能使其比主体访问级别更严格。 有关详细信息,请参阅如何:声明具有混合访问级别的属性

参数声明

声明每个参数的方式与声明 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)

请参阅