Skip to content

Property

声明构成Property过程主体的名称、参数和代码:获取属性值、为属性赋值或设置对象属性引用的过程。

属性通过最多三个属性过程向调用者公开,这些过程在同一模块中共享相同的name

  • Property Get过程返回属性的值(或对象引用)。
  • Property Let过程为属性赋非对象值。
  • Property Set过程为属性赋对象引用。

语法:

  • [ attributes ]
    [ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Get name [ ( Of typevars ) ] [ ( arglist ) ] [ As type ] [ binding-clause ]
         [ statements ] ...
         [ [ Let ] name = expression ] ...
         [ Set name = expression ] ...
         [ Return expression ] ...
         [ Exit Property ] ...
         [ statements ] ...
    End Property

  • [ attributes ]
    [ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Let name [ ( Of typevars ) ] ( [ arglist , ] value ) [ binding-clause ]
         [ statements ] ...
         [ Exit Property ] ...
         [ statements ] ...
    End Property

  • [ attributes ]
    [ Public | Private | Friend | Protected ] [ Static ] [ Overridable ] Property Set name [ ( Of typevars ) ] ( [ arglist , ] reference ) [ binding-clause ]
         [ statements ] ...
         [ Exit Property ] ...
         [ statements ] ...
    End Property

attributes

可选 过程的一个或多个受支持属性

Public

可选 指示Property过程可被所有模块中的所有其他过程访问。如果在包含Option Private语句的模块中使用,则该过程在项目外不可用。

Private

可选 指示Property过程仅在其声明的模块中的其他过程可访问。

Friend

可选 仅在类模块中使用。指示Property过程在整个项目中可见,但对对象实例的控制器不可见。

Protected

可选 (twinBASIC) 仅在类中使用。指示Property过程可从声明类的内部和通过Inherits派生的类中访问,但外部调用者不能访问。同一属性的三个访问器形式(GetLetSet)应在访问修饰符上保持一致。

Static

可选 指示Property过程的局部变量在调用之间保留。Static属性不影响在Property过程外部声明的变量,即使它们在过程中被使用。

Overridable

可选 (twinBASIC) 将Property标记为继承钩子,通过Inherits派生的类可以用Overrides子句替换。仅在参与Inherits层次结构的类成员上有意义。

name

Property过程的名称;遵循标准变量命名约定,但同一模块中匹配的Property GetProperty LetProperty Set过程共享相同的名称。

Of typevars

可选 一个或多个类型变量名称,遵循标准变量命名约定。名称以逗号分隔。使过程成为泛型Property过程。匹配的Property GetProperty LetProperty Set过程必须声明相同的泛型参数。

arglist

表示调用Property过程时传递参数的变量列表。多个参数以逗号分隔。Property LetProperty Set过程中每个参数的名称和数据类型必须与匹配的Property Get过程中对应参数相同。语法见下面的arglistarglistProperty Get是可选的;对于Property LetProperty Set,至少需要value/reference参数。

As type

可选 Property Get过程返回值的数据类型;可以是ByteBooleanIntegerLongCurrencySingleDoubleDecimalDateString(定长除外)、ObjectVariant、用户自定义类型或数组。Property Get过程的返回type必须与对应Property Let过程的value参数(如果存在)的数据类型相同,或与对应Property Set过程的reference参数兼容。

statements

可选Property过程主体中执行的任何语句组。

expression

可选Property Get中,过程返回的值(或用Set赋值时的引用)。

value

Property Let中,包含要赋给属性值的变量。调用过程时,此参数出现在调用表达式的右侧。value的数据类型必须与对应Property Get过程的返回类型相同。value不能为OptionalParamArray

reference

Property Set中,包含对象引用赋值右侧使用的对象引用的变量。reference不能为Optional

binding-clause

可选 (twinBASIC) 三种尾随子句之一,将此访问器绑定到在其他地方声明的成员:

  • Handles object.event [ , object.event … ]——将属性连接为命名事件的处理程序,取代传统的Object_Event命名约定。参见Handles语句
  • Implements iface.member [ , iface2.member2 … ]——为命名的Interface(或Class)成员提供主体,取代传统的Iface_Member命名约定。逗号分隔列表允许一个主体同时满足多个接口的成员。参见Implements语句
  • Overrides base.member——为通过Inherits继承的Overridable member提供主体。与同一标题上的Overridable组合可允许更深层派生类再次覆盖。
Exit Property

可选 立即从Property过程返回而不设置返回值。在Property GetProperty LetProperty Set中有效。

Return expression

可选 仅在Property Get过程中有效。立即从过程返回并以expression作为属性值。此形式中expression是必需的;裸Return保留给GoSub...Return构造,不会退出Property过程。

arglist

语法:一个或多个
[ Optional ] [ ByVal | ByRef ] [ ParamArray ] varname [ () ] [ As type ] [ = defaultvalue ]

Optional
可选 指示参数不是必需的。如果使用,arglist中后续的所有参数也必须是可选的,并使用Optional关键字声明。Property LetProperty Set调用的右侧(valuereference参数)不能为Optional
ByVal
可选 指示参数按值传递。
ByRef
可选 指示参数按引用传递。与Visual Basic .NET不同,ByRef是默认的。
ParamArray
可选 指示参数是Variant元素的Optional数组。ParamArray关键字允许传递任意数量的参数。不能与ByValByRefOptional一起使用,也不能作为Property LetProperty Set过程的value/reference参数。
varname
表示参数的变量名称;遵循标准变量命名约定。
type
可选 传递给过程的参数的数据类型;可以是ByteBooleanIntegerLongCurrencySingleDoubleDecimalDateString(仅变长)、ObjectVariant、特定对象类型或泛型类型参数的名称。如果参数不是Optional,也可以指定用户自定义类型。
如果使用泛型类型参数的名称,它将绑定到传递给过程的参数的具体类型。名称绑定的作用域为过程主体。
defaultvalue
可选 任何常量或常量表达式。仅对Optional参数有效。如果类型为Object,则显式默认值只能为Nothing

如果未使用PublicPrivateFriend显式指定,Property过程默认为公共的。如果未使用Static,局部变量的值在调用之间不保留。

Friend关键字只能在类模块中使用。但是,Friend过程可被项目中任何模块的过程访问。Friend过程不出现在其父类的类型库中,也不能被后期绑定。

所有可执行代码必须在过程中。Property过程不能在另一个**PropertySubFunction**过程内部定义。

Exit Property语句,以及Return expression语句(仅在Property Get中),导致从Property过程立即退出。程序执行继续到调用Property过程的语句之后的语句。这些语句可以出现在Property过程中的任何位置,数量不限。

SubFunction过程类似,Property过程是一个独立的过程,可以接受参数、执行一系列语句并更改其参数的值。Property Get过程可以像Function或属性名一样用在表达式的右侧。Property Let过程只能用在属性赋值表达式或Let语句的左侧。Property Set过程只能用在对象引用赋值或**Set**语句的左侧。

示例

本示例使用Property语句定义一个PenColor属性:一个接受颜色名字符串并存储数字代码的Property Let,以及一个从存储的数字代码返回颜色名的Property Get

vb
Dim CurrentColor As Integer
Const BLACK = 0, RED = 1, GREEN = 2, BLUE = 3

' Set the pen color property for a Drawing package.
' The module-level variable CurrentColor is set to
' a numeric value that identifies the color used for drawing.
Property Let PenColor(ColorName As String)
    Select Case ColorName ' Check color name string.
        Case "Red"
            CurrentColor = RED ' Assign value for Red.
        Case "Green"
            CurrentColor = GREEN ' Assign value for Green.
        Case "Blue"
            CurrentColor = BLUE ' Assign value for Blue.
        Case Else
            CurrentColor = BLACK ' Assign default value.
    End Select
End Property

' Returns the current color of the pen as a string.
Property Get PenColor() As String
    Select Case CurrentColor
        Case RED:   PenColor = "Red"
        Case GREEN: PenColor = "Green"
        Case BLUE:  PenColor = "Blue"
    End Select
End Property

' Calling code:
PenColor = "Red"        ' Calls Property Let.
ColorName = PenColor    ' Calls Property Get.

Property Set过程赋值对象引用,方式与Property Let赋值非常类似:

vb
' The Pen property may be set to different Pen implementations.
Property Set Pen(P As Object)
    Set CurrentPen = P ' Assign Pen to object.
End Property

另请参阅

twinBASIC及其LOGO版权为作者"韦恩"所有