短い答え
Q:コンパイラは、バックグラウンドで、このコード行をフィールドを含むより詳細なプロパティ構造に実際に変換します_Buses
か?
A:はい
Q:_Buses
構造Public Property x AS yを使用している限り、実際に宣言しなくても、これらのフィールドの1つが使用可能になりますか?
A:はい
説明(ロングアンサー)
Get
自動実装されたプロパティは、通常、プロパティのおよびSet
部分のコードを明示的に指定しないプロパティです。自動実装プロパティの一般的な定義は次のとおりです。
Public Property Age As Integer
また
Public Property Age As Integer = 5
どちらの場合も、コンパイラーはすべてのバッキングフィールドと初期化子を自動的に生成します。
2つの自動実装プロパティ(Name
およびAge
)と1つの通常のプロパティ(Address
)を持つ次のクラスについて考えてみます。
Public Class Person
Dim _address As String
Public Sub New()
_address = "4, Hutchinson Road"
End Sub
Public Property Name As String
Public Property Age As Integer = 3
Public Property Address As String
Get
Return _address
End Get
Set(value As String)
_address = value
End Set
End Property
Public Overrides Function ToString() As String
Return _Name & " Age: " & Me.Age.ToString()
End Function
End Class
コンパイラは、およびプロパティのバッキングフィールドGet
とSet
メソッドを自動的に生成します。生成されたフィールドは、前にアンダースコアが付いたプロパティと同じ名前になります。したがって、プロパティのバッキングフィールドはであり、プロパティのバッキングフィールドはです。Name
Age
Name
_Name
Age
_Age
自動生成されたフィールドには、属性DebuggerBrowsable(DebuggerBrowsableState.Never)
とCompilerGenerated
属性も付加されています。
属性は、フィールドがコードエディタのDebuggerBrowsable
オートコンプリートリストに表示されないようにします。ToString
ただし、これは、フィールドを直接使用するメソッドでわかるように、コード内でフィールドに直接アクセスすることを妨げるものではありません_Name
。
このCompilerGenerated
属性は、フィールドがコンパイラーによって作成されたことを示します。
Age
プロパティ(および初期化子を使用して自動実装されたすべてのプロパティ)は、クラスのデフォルトコンストラクターで初期化されます。
上記のクラスの逆コンパイルされたバージョンは次のようになります。
Public Class Person
' Methods
Public Sub New()
Me.Age = 3
Me._address = "4, Hutchinson Road"
End Sub
Public Overrides Function ToString() As String
Return String.Join(" ", New String() { Me._Name, Me.Age.ToString })
End Function
' Properties
Public Property Address As String
Get
Return Me._address
End Get
Set(ByVal value As String)
Me._address = value
End Set
End Property
Public Property Age As Integer
<DebuggerNonUserCode> _
Get
Return Me._Age
End Get
<DebuggerNonUserCode> _
Set(ByVal AutoPropertyValue As Integer)
Me._Age = AutoPropertyValue
End Set
End Property
Public Property Name As String
<DebuggerNonUserCode> _
Get
Return Me._Name
End Get
<DebuggerNonUserCode> _
Set(ByVal AutoPropertyValue As String)
Me._Name = AutoPropertyValue
End Set
End Property
' Fields
Private _address As String
<CompilerGenerated, DebuggerBrowsable(DebuggerBrowsableState.Never)> _
Private _Age As Integer
<DebuggerBrowsable(DebuggerBrowsableState.Never), CompilerGenerated> _
Private _Name As String
End Class
ご覧のとおり、フィールド_Name
と_Age
は自動的に生成されるため、コードで問題なく使用できます。