我有一个vb Class
,其中包含以下Property
:
Public Property Buses As Integer
这相当于更详细的属性吗?
编译器是否实际在后台将这行代码转换为更详细的Property
结构,其中包含字段_Buses
?
因此,如果我使用结构_Buses
而没有实际声明Public Property x AS y
,那么其中一个字段是否可用?
修改
实际上不太确定是否可以添加比HERE ON MSDN
答案 0 :(得分:2)
问:编译器是否实际在后台将这行代码转换为更详细的属性结构,其中包含字段_Buses
?
A:是
问:在我使用Public Property x AS y结构时,如果没有实际声明_Buses
,那么其中一个字段是否可用?
A:是
<小时/>
自动实现的属性通常是您未明确指定属性的Get
和Set
部分的代码的属性。自动实现属性的一般定义如下:
Public Property Age As Integer
或
Public Property Age As Integer = 5
在这两种情况下,编译器会自动为您生成所有支持字段和初始值设定项。
考虑以下类,其中包含两个自动实现的属性(Name
和Age
)和一个常规属性(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
编译器会自动为Get
和Set
属性生成支持字段以及Name
和Age
方法。
生成的字段与具有前面下划线的属性具有相同的名称。因此,Name
属性的支持字段为_Name
,Age
属性的支持字段为_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()
之类的操作,因此虽然更容易在眼睛(和手指)上使用,但通常更好的方法是使用完整部分恕我直言。