Vb.net 什么是自动实现的字段

Vb.net 什么是自动实现的字段,vb.net,visual-studio,visual-studio-express,Vb.net,Visual Studio,Visual Studio Express,我有一个vb类,其中包含以下属性: 公共财产巴士为整数 这是否相当于一个更详细的属性 编译器是否真的在后台将这行代码转换为更详细的属性结构,其中包括一个字段\u总线 因此,在不实际声明\u总线的情况下,只要我使用结构公共属性x作为y,那么其中一个字段将可用吗 编辑 实际上,不太确定是否可以添加更多的内容。好吧,回答是:是的,在内部,这将转换为完整的属性部分。您甚至可以在代码中访问\u总线 但您也应该以最佳方式设置默认值(尽管不是强制性的): 使用这种简短语法的缺点是,在其Set()过程中无法对

我有一个vb
,其中包含以下
属性

公共财产巴士为整数

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

编译器是否真的在后台将这行代码转换为更详细的
属性
结构,其中包括一个字段
\u总线

因此,在不实际声明
\u总线
的情况下,只要我使用结构
公共属性x作为y
,那么其中一个字段将可用吗


编辑

实际上,不太确定是否可以添加更多的内容。好吧,回答是:是的,在内部,这将转换为完整的属性部分。您甚至可以在代码中访问
\u总线

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


使用这种简短语法的缺点是,在其
Set()
过程中无法对值执行验证(当然,当需要使用值时,可以执行此操作,但这种类型或部分情况会破坏使用属性的目的)。如果您正在构建一个用户控件,您可能会在
Set()
上执行诸如
Invalidate
之类的操作,因此尽管眼睛(和手指)更容易操作,但通常最好使用完整的部分IMHO。

好吧,回答:是的,在内部,它被转换为完整的属性部分。您甚至可以在代码中访问
\u总线

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

使用这种简短语法的缺点是,在其
Set()
过程中无法对值执行验证(当然,当需要使用值时,可以执行此操作,但这种类型或部分情况会破坏使用属性的目的)。如果您正在构建一个用户控件,您可能会在
Set()
上执行
Invalidate
等操作,因此,尽管眼睛(和手指)更容易操作,但通常最好使用完整的IMHO部分。

简短回答 Q:编译器是否真的在后台将这行代码转换为更详细的属性结构,其中包括一个字段
\u

A:

Q:没有实际声明
\u总线
只要我使用结构公共属性x作为y,那么其中一个字段将可用?
A:


解释(长答覆) 自动实现的属性通常是不明确为属性的
Get
Set
部分指定代码的属性。自动实现属性的一般定义如下:

Public Property Age As Integer

在这两种情况下,编译器都会自动为您生成所有支持字段和初始值设定项

考虑以下具有两个自动实现属性(
Name
Age
)和一个常规属性(
Address
)的类

编译器自动为
Name
Age
属性生成支持字段以及
Get
Set
方法。 生成的字段与前面带有下划线的属性具有相同的名称。因此,
Name
属性的支持字段是
\u Name
Age
属性的支持字段是
\u Age

自动生成的字段还附加了
DebuggerBrowsable(DebuggerBrowsableState.Never)
CompilerGenerated
属性

DebuggerBrowsable
属性可防止字段显示在代码编辑器的自动完成列表中。但是,这并不妨碍您直接访问代码中的字段,您可以在
ToString
方法中看到,在该方法中,我直接使用
\u 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
公共类人物
"方法",
公共分新()
我的年龄=3岁
Me.\u address=“哈钦森路4号”
端接头
Public将函数ToString()重写为字符串
返回String.Join(“,New String(){Me.\u Name,Me.Age.ToString})
端函数
"性质",
作为字符串的公共属性地址
得到
给我回个地址
结束
设置(ByVal值作为字符串)
Me.\u地址=值
端集
端属性
公共财产年限为整数
_
得到
还给我
结束
_
设置(ByVal AutoPropertyValue为整数)
Me.\u年龄=自动属性值
端集
端属性
作为字符串的公共属性名称
_
得到
把你的名字还给我
结束
_
设置(ByVal AutoPropertyValue作为字符串)
Me.\u Name=AutoPropertyValue
端集
端属性
“田地
私有地址作为字符串
_
Private _Age为整数
_
Private\u名称作为字符串
末级
如您所见,字段
\u Name
\u Age
是自动为您生成的,因此您可以在代码中使用它们,而不会出现任何问题。

简短回答 Q:编译器是否真的在后台将这行代码转换为更详细的属性结构,其中包括一个字段
\u

A:

Q:没有实际声明
\u总线
只要我使用结构公共属性x作为y,那么其中一个字段将可用?
A:


Public Property Age As Integer = 5
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
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