屬性程序 (Visual Basic)

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

Visual Basic 提供下列屬性程序:

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

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

當您使用自動實作的屬性時,可以省略 GetSet 程序。 如需詳細資訊,請參閱自動實作的屬性

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

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

宣告語法

屬性本身是由包含在 Property 陳述式End 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 陳述式中定義,而不是在屬性程序中定義。 一個屬性只能有一個資料類型。 例如,您無法定義屬性儲存值 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)

另請參閱