0

Class私はその中に次のものを含むvbを持っていますProperty

Public Property Buses As Integer

これは、より詳細なプロパティと同等ですか?

Propertyコンパイラは、バックグラウンドで、このコード行をフィールドを含むより詳細な構造に実際に変換します_Busesか?

したがって_Buses、構造を使用している限り実際に宣言しなくてもPublic Property x AS y、これらのフィールドの1つが使用可能になりますか?


編集実際には、 MSDN
でここ よりもはるかに多くを追加できるかどうかはわかりません

4

2 に答える 2

2

短い答え

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

コンパイラは、およびプロパティのバッキングフィールドGetSetメソッドを自動的に生成します。生成されたフィールドは、前にアンダースコアが付いたプロパティと同じ名前になります。したがって、プロパティのバッキングフィールドはであり、プロパティのバッキングフィールドはです。NameAgeName_NameAge_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は自動的に生成されるため、コードで問題なく使用できます。

于 2012-10-16T10:30:31.837 に答える
1

ええと、答えます:はい、内部的にこれは完全なプロパティセクションに変換されます。コードでアクセスすることもでき_Busesます。

ただし、デフォルトも最適に設定する必要があります(必須ではありません)。

Public Property Buses As Integer = 0

この短い構文を使用する場合の欠点は、その間に値の検証を実行できないことですSet()(もちろん、値を使用する必要がある場合はこれを実行できますが、その種類または部分的にプロパティを使用する目的が無効になります)。ユーザーコントロールを構築している場合は、おそらくでなどの操作を行うInvalidateためSet()、目(および指)では簡単ですが、多くの場合、セクション全体のIMHOを使用することをお勧めします。

于 2012-10-16T07:57:27.440 に答える