自動実装プロパティ (Visual Basic)

"自動実装プロパティ" を使用すると、プロパティを Get および Set するコードを記述しなくても、クラスのプロパティをすばやく指定できます。 自動実装プロパティのコードを記述する場合、Visual Basic コンパイラでは、関連付けられた Get プロシージャおよび Set プロシージャが作成されるだけでなく、プロパティの変数を格納するためのプライベート フィールドが自動的に作成されます。

自動実装プロパティを使用することで、プロパティを既定値も含めて 1 つの行で宣言できます。 次に、プロパティ宣言の 3 つの例を示します。

Public Property Name As String
Public Property Owner As String = "DefaultName"
Public Property Items As New List(Of String) From {"M", "T", "W"}
Public Property ID As New Guid()

自動実装プロパティは、プライベート フィールドにプロパティ値が格納されたプロパティに相当します。 自動実装プロパティを次のコード例に示します。

Property Prop2 As String = "Empty"

次のコード例は、前の自動実装プロパティの例で示したコードと同じ結果になります。

Private _Prop2 As String = "Empty"
Property Prop2 As String
    Get
        Return _Prop2
    End Get
    Set(ByVal value As String)
        _Prop2 = value
    End Set
End Property

次のコードは、読み取り専用プロパティの実装を示しています。

Class Customer  
   Public ReadOnly Property Tags As New List(Of String)  
   Public ReadOnly Property Name As String = ""  
   Public ReadOnly Property File As String  
  
   Sub New(file As String)  
      Me.File = file  
   End Sub  
End Class  

例で示されているように、初期化式でプロパティに割り当てることができます。また、含む型のコンストラクター内でプロパティに割り当てることもできます。 任意の時点で読み取り専用プロパティのバッキング フィールドに割り当てることができます。

バッキング フィールド

Visual Basic では、自動実装プロパティを宣言すると、プロパティ値を格納するための "バッキング フィールド" と呼ばれる隠しプライベート フィールドが自動的に作成されます。 バッキング フィールド名は、自動実装プロパティ名の前にアンダースコア (_) が付いた名前になります。 たとえば、ID という名前の自動実装プロパティを宣言した場合は、バッキング フィールド名は _ID になります。 同じ _ID という名前のクラスのメンバーを含めた場合、名前の競合が発生し、Visual Basic でコンパイル エラーが報告されます。

また、バッキング フィールドには、次の特性もあります。

  • バッキング フィールドのアクセス修飾子は、そのプロパティ自体に Public などの別のアクセス レベルがある場合でも、常に Private です。

  • プロパティ フィールドが Shared としてマークされている場合は、バッキング フィールドも共有になります。

  • プロパティに指定された属性は、バッキング フィールドには適用されません。

  • バッキング フィールドは、クラス内のコードや、ウォッチ ウィンドウなどのデバッグ ツールからアクセスできます。 ただし、バッキング フィールドは IntelliSense の単語補完リストには表示されません。

自動実装プロパティの初期化

フィールドの初期化に使用する式は、すべて自動実装プロパティの初期化にも使用できます。 自動実装プロパティを初期化する場合、その式は評価され、そのプロパティの Set プロシージャに渡されます。 次のコード例は、初期値を持ついくつかの自動実装プロパティを示しています。

Property FirstName As String = "James"
Property PartNo As Integer = 44302
Property Orders As New List(Of Order)(500)

Interface のメンバーである自動実装プロパティ、または MustOverride としてマークされた自動実装プロパティを初期化することはできません。

自動実装プロパティを Structure のメンバーとして宣言した場合、自動実装プロパティを Shared としてマークした場合にのみ初期化できます。

自動実装プロパティを配列として宣言した場合、明示的な配列の範囲は指定できません。 しかし、次の例に示すように、配列初期化子を使用して値を指定することができます。

Property Grades As Integer() = {90, 73}
Property Temperatures As Integer() = New Integer() {68, 54, 71}

標準構文を必要とするプロパティ定義

自動実装プロパティは使いやすく、多くのプログラミング シナリオに対応します。 ただし、自動実装プロパティを使用できず、代わりに標準の ("展開された") プロパティ構文を使用しなければならない場合もあります。

次のいずれかを実行する場合は、展開されたプロパティ定義構文を使用する必要があります。

  • Set プロシージャで受信した値を検証するコードなどのコードを、プロパティの Get プロシージャまたは Set プロシージャに追加する。 たとえば、電話番号を示す文字列のプロパティ値を設定する前に、その文字列に必要な数の数字が含まれていることを検証する場合です。

  • Get プロシージャと Set プロシージャに異なるアクセシビリティを指定する。 たとえば、Set プロシージャを Private にし、Get プロシージャを Public にする場合です。

  • WriteOnly のプロパティを作成する。

  • パラメーター化されたプロパティ (Default プロパティなど) を使用する。 プロパティのパラメーターを指定するか、Set プロシージャに追加のパラメーターを指定するには、展開されたプロパティを宣言する必要があります。

  • バッキング フィールドに属性を指定するか、バッキング フィールドのアクセス レベルを変更する。

  • バッキング フィールドに XML コメントを指定する。

自動実装プロパティの展開

自動実装プロパティを Get プロシージャまたは Set プロシージャを含む展開されたプロパティに変換する必要がある場合、Visual Basic コード エディターを使用すると、Get プロシージャおよび Set プロシージャと、そのプロパティの End Property ステートメントを自動的に生成できます。 Property ステートメントの後の空白行にカーソルを置き、「G」(Get を表します) または「S」(Set を表します) と入力し、Enter キーを押すと、このコードが生成されます。 Property ステートメントの最後で Enter キーを押すと、読み取り専用のプロパティおよび書き込み専用のプロパティの Get プロシージャまたは Set プロシージャが Visual Basic コード エディターで自動的に作成されます。

関連項目