自動実装プロパティ (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 コード エディターで自動的に作成されます。
関連項目
.NET