如何:在 Visual Basic 中声明和调用默认属性

默认属性是代码无需指定该属性即可访问的类或结构属性。 在将类或结构命名为代码名而不是属性,并且上下文允许访问属性时,如果该类或结构存在默认属性,Visual Basic 将解析对该默认属性的访问。

类或结构最多可以有一个默认属性。 但是,您可以重载默认属性,并为其创建多个版本。

有关详细信息,请参阅 默认值

声明默认属性

  1. 以正常方式声明属性。 请勿指定 SharedPrivate 关键字。

  2. Default 属性声明中包括关键字。

  3. 为属性指定至少一个参数。 不能定义不采用至少一个参数的默认属性。

    Default Property myProperty(ByVal index As Integer) As String
    

调用默认属性

  1. 声明包含类或结构类型的变量。

    Dim x As New class1(3)
    
  2. 在通常包含属性名称的表达式中单独使用变量名称。

    MsgBox(x)
    
  3. 在变量名称后面加上括号中的参数列表。 默认属性必须至少采用一个参数。

    MsgBox(x(1))
    
  4. 若要检索默认属性值,请在表达式中使用变量名称和参数列表,或在赋值语句的等号(=)符号之后使用变量名称。

    MsgBox(x(1) & x(2) & x(3))
    
  5. 若要设置默认属性值,请将变量名称与赋值语句左侧的参数列表一起使用。

    x(1) = "Hello"
    x(2) = " "
    x(3) = "World"
    
  6. 始终可以指定默认属性名称以及变量名称,就像访问任何其他属性一样。

    x.myProperty(1) = "Hello"
    x.myProperty(2) = " "
    x.myProperty(3) = "World"
    

示例 1

以下示例在类上声明一个默认属性。

Public Class class1
    Private myStrings() As String
    Sub New(ByVal size As Integer)
        ReDim myStrings(size)
    End Sub
    Default Property myProperty(ByVal index As Integer) As String
        Get
            ' The Get property procedure is called when the value
            ' of the property is retrieved.
            Return myStrings(index)
        End Get
        Set(ByVal Value As String)
            ' The Set property procedure is called when the value
            ' of the property is modified.
            ' The value to be assigned is passed in the argument 
            ' to Set.
            myStrings(index) = Value
        End Set
    End Property
End Class

示例 2

下面的示例演示如何在类myProperty上调用默认属性class1。 三个赋值语句将值存储在其中 myProperty,调用 MsgBox 将读取值。

Sub Test()
    Dim x As New class1(3)
    x(1) = "Hello"
    x(2) = " "
    x(3) = "World"
    MsgBox(x(1) & x(2) & x(3))
End Sub

默认属性最常见的用途是在各种集合类上的 Item[] 属性。

可靠的编程

默认属性可能会导致源代码字符减少,但它们会使代码更易于阅读。 如果调用代码不熟悉类或结构,则当调用代码引用类或结构名称时,它无法确定该引用是访问类或结构本身还是默认属性。 这可能会导致编译器错误或微妙的运行时逻辑错误。

可以通过始终使用 Option Strict 语句 将编译器类型检查设置为 On 来减少默认属性相关错误的可能性。

如果打算在代码中使用预定义的类或结构,则必须确定它是否具有默认属性,如果是,则其名称是什么。

由于这些缺点,应考虑不定义默认属性。 对于代码可读性,还应考虑始终显式引用所有属性,甚至默认属性。

另请参阅