0

我有一个Class包含以下内容的vb Property

Public Property Buses As Integer

这是否相当于更详细的属性?

编译器是否真的在后台将这行代码转换为Property包含字段的更详细的结构_Buses

_Buses因此,只要我使用该结构而不实际声明,Public Property x AS y那么这些字段之一将可用?


编辑
实际上不太确定是否可以添加比MSDN 上的 HERE更多的内容

4

2 回答 2

2

简短的答案

问:编译器是否真的在后台将这行代码转换为包含字段的更详细的 Property 结构_Buses
答:是的

问:没有实际声明_Buses,只要我使用结构 Public Property x AS y 那么这些字段之一将可用?
答:是的


解释(长答案)

自动实现的属性通常是您没有为属性的GetSet部分明确指定代码的属性。自动实现属性的一般定义如下:

Public Property Age As Integer

或者

Public Property Age As Integer = 5

在这两种情况下,编译器都会自动为您生成所有支持字段和初始化程序。

考虑以下具有两个自动实现的属性 (NameAge) 和一个常规属性 ( 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(),因此尽管在眼睛(和手指)上更容易,但通常最好使用完整部分恕我直言。

于 2012-10-16T07:57:27.440 回答