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