什么是自动实现的字段

时间:2012-10-16 07:21:08

标签: vb.net visual-studio visual-studio-express

我有一个vb Class,其中包含以下Property

Public Property Buses As Integer

这相当于更详细的属性吗?

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

因此,如果我使用结构_Buses而没有实际声明Public Property x AS y,那么其中一个字段是否可用?


修改
实际上不太确定是否可以添加比HERE ON MSDN

更多的内容

2 个答案:

答案 0 :(得分:2)

简短答案

问:编译器是否实际在后台将这行代码转换为更详细的属性结构,其中包含字段_Buses
A:

问:在我使用Public Property x AS y结构时,如果没有实际声明_Buses,那么其中一个字段是否可用?
A:

<小时/>

解释(完整答案)

自动实现的属性通常是您未明确指定属性的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属性生成支持字段以及NameAge方法。 生成的字段与具有前面下划线的属性具有相同的名称。因此,Name属性的支持字段为_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,以便您可以在代码中使用它们而不会出现任何问题。

答案 1 :(得分:1)

嗯,回答:是的,在内部,这将转换为完整的属性部分。您甚至可以在代码中访问_Buses

但您也应该以最佳方式设置默认值(但不是强制性的):

Public Property Buses As Integer = 0

使用这种短语法的缺点是你无法在Set()期间对值进行验证(当然你可以在需要使用该值时执行此操作,但这种或部分失败了目的使用属性)。如果您正在构建用户控件,您可能会在Invalidate上执行诸如Set()之类的操作,因此虽然更容易在眼睛(和手指)上使用,但通常更好的方法是使用完整部分恕我直言。