Property プロシージャ (Visual Basic)

プロパティ プロシージャは、モジュール、クラス、または構造体のカスタム プロパティを操作する一連の Visual Basic ステートメントです。 プロパティ プロシージャは、"プロパティ アクセサー" とも呼ばれます。

Visual Basic には、次のプロパティ プロシージャが用意されています。

  • Get プロシージャは、プロパティの値を返します。 式でプロパティにアクセスするときに呼び出されます。
  • Set プロシージャは、プロパティを値 (オブジェクト参照を含む) に設定します。 プロパティに値を割り当てるときに呼び出されます。

通常は、Get および Set ステートメントを使用して、プロパティ プロシージャをペアで定義しますが、プロパティが読み取り専用 (Get ステートメント) または書き込み専用 (Set ステートメント) の場合は、いずれかのプロシージャだけを定義できます。

自動実装プロパティを使用する場合は、Get および Set プロシージャを省略できます。 詳細については、「自動実装プロパティ」を参照してください。

プロパティは、クラス、構造体、モジュールで定義できます。 プロパティは既定で Public であるため、プロパティのコンテナーにアクセスできるアプリケーション内のどこからでも呼び出すことができます。

プロパティと変数の比較については、「Differences Between Properties and Variables in Visual Basic (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 では、アクセス レベルと、オーバーロード、オーバーライド、共有、シャドウに関する情報、およびプロパティが読み取り専用または書き込み専用かどうかを指定できます。 Get または Set プロシージャの AccessLevel には、プロパティ自体に指定されたアクセス レベルよりも制限の厳しい任意のレベルを指定できます。 詳細については、「Property Statement (Property ステートメント)」をご覧ください。

データの種類

プロパティのデータ型とプリンシパル アクセス レベルは、プロパティ プロシージャではなく、Property ステートメントで定義されます。 プロパティはデータ型を 1 つだけ持つことができます。 たとえば、Decimal 値を格納し、Double 値を取得するプロパティを定義することはできません。

アクセス レベル

プロパティのプリンシパル アクセス レベルを定義し、プロパティ プロシージャの 1 つでアクセス レベルをさらに制限できます。 たとえば、Public プロパティを定義し、Private Set プロシージャを定義できます。 Get プロシージャは Public のままです。 アクセス レベルは、プロパティのプロシージャの 1 つでのみ変更することができ、プリンシパル アクセス レベルよりも厳しい制限にすることだけが可能です。 詳細については、「方法:方法: 複数のアクセス レベルを持つプロパティを宣言する をご覧ください。

パラメーターの宣言

引渡し方法に ByVal を指定する必要がある点を除き、Sub プロシージャの場合と同様に各パラメーターを宣言します。

パラメーター リストの各パラメーターの構文は次のとおりです。

[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)

宣言と呼び出しの実例

次のプロパティは、フル ネームを 2 つの構成要素名 (名と姓) として格納します。 呼び出し元のコードが fullName を読み取ると、Get プロシージャが 2 つの構成要素名を結合し、フル ネームを返します。 呼び出し元のコードが新しいフル ネームを割り当てると、Set プロシージャがそれを 2 つの構成要素名に分割することを試みます。 スペースが見つからない場合は、すべてが名として格納されます。

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)

関連項目