屬性程序 (Visual Basic)

屬性程序是一系列 Visual Basic 陳述式,可操作模組、類別或結構上的自訂屬性。 屬性程序也稱為「屬性存取子」。

Visual Basic 提供下列屬性程序:

  • Get 程序會傳回屬性值。 當您存取運算式中的屬性時,就會呼叫此程序。
  • Set 程序會將屬性設定為值,包括物件參考。 當您將值指派給屬性時,就會呼叫此程序。

您通常會使用 Get 和 Set 陳述式來成對定義屬性程序,但如果屬性為唯讀 (Get 陳述式) 或唯寫 (Set 陳述式),則可以單獨定義任一程序。

使用自動實作的屬性時,您可以省略 Get 和 Set 程式。 如需詳細資訊,請參閱 自動實作的屬性。

您可以在類別、結構和模組中定義屬性。 屬性預設為 Public,這表示您可以從能存取屬性容器之應用程式中的任何位置呼叫屬性。

如需屬性和變數的比較,請參閱 Visual Basic 中屬性和變數的差異。

宣告語法

屬性本身是由包含在 Property 陳述式與 End Property 陳述式之間的程式碼區塊所定義。 在這個區塊內,每個屬性程序都會顯示為包含在一個宣告陳述式 (Get 或 Set) 與相符 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 可以指定有關多載、覆寫、共用和遮蔽的存取層級和資訊,以及屬性是唯讀還是唯寫。 AccessLevel 或 Get 上的 Set 可以是任何比屬性本身指定的存取層級更高限制的層級。 如需詳細資訊,請參閱 Property 陳述式。

資料類型

屬性的資料類型和主體存取層級是在 Property 陳述式中定義,而不是在屬性程序中定義。 一個屬性只能有一個資料類型。 例如,您無法定義一個屬性來儲存 Decimal 值,然後擷取 Double 值。

存取層級

不過,您可以為屬性定義一個主要的存取層級,並在其屬性程序之一中進一步限制這個存取層級。 例如,您可以定義 Public 屬性,然後定義 Private Set 程序。 Get 程序會保持 Public。 您只能在一個屬性程序中更改存取層級,且只能將其設置得比主要存取層級更嚴格。 如需詳細資訊,請參閱操作說明:宣告混合存取層級的屬性。

參數宣告

宣告每個參數的方式與宣告 Sub 程序相同,不同之處在於傳遞機制必須是 ByVal。

參數清單中的每個參數語法如下:

[Optional] ByVal [ParamArray] parametername As datatype

如果參數為選擇性,您也必須在其宣告中提供預設值。 指定預設值的語法如下:

Optional ByVal parametername As datatype = defaultvalue

屬性值

在 Get 程序中,會將傳回值當作屬性值提供給呼叫運算式。

在 Set 程序中,會將新屬性值傳遞至 Set 陳述式的參數。 如果您明確宣告參數,則必須使用與屬性相同的資料類型來宣告參數。 如果您未宣告參數,則編譯器會使用隱含參數 Value 來表示要指派給屬性的新值。

呼叫語法

您可以透過參考屬性來隱式呼叫屬性程序。 使用屬性名稱與使用變數名稱的方式相同,不同之處在於必須為所有非選擇性引數提供值,且必須以括弧括住引數清單。 如果未提供任何引數,您可以選擇性地省略括弧。

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 屬性程序的一般呼叫:

fullName = "MyFirstName MyLastName"
MsgBox(fullName)

另請參閱