我有一个Class
包含以下内容的vb Property
:
Public Property Buses As Integer
这是否相当于更详细的属性?
编译器是否真的在后台将这行代码转换为Property
包含字段的更详细的结构_Buses
?
_Buses
因此,只要我使用该结构而不实际声明,Public Property x AS y
那么这些字段之一将可用?
编辑
实际上不太确定是否可以添加比MSDN 上的 HERE更多的内容
我有一个Class
包含以下内容的vb Property
:
Public Property Buses As Integer
这是否相当于更详细的属性?
编译器是否真的在后台将这行代码转换为Property
包含字段的更详细的结构_Buses
?
_Buses
因此,只要我使用该结构而不实际声明,Public Property x AS y
那么这些字段之一将可用?
编辑
实际上不太确定是否可以添加比MSDN 上的 HERE更多的内容
问:编译器是否真的在后台将这行代码转换为包含字段的更详细的 Property 结构_Buses
?
答:是的
问:没有实际声明_Buses
,只要我使用结构 Public Property x AS y 那么这些字段之一将可用?
答:是的
自动实现的属性通常是您没有为属性的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
是自动为您生成的,因此您可以在代码中使用它们而不会出现任何问题。
好吧,回答:是的,在内部这被转换为一个完整的属性部分。您甚至可以_Buses
在您的代码中访问。
但是你也应该最好地设置一个默认值(虽然不是强制性的):
Public Property Buses As Integer = 0
使用这种简短语法的缺点是您无法在其期间对值执行验证Set()
(您当然可以在需要使用该值时执行此操作,但这种或部分违背了使用属性的目的)。如果您正在构建用户控件,您可能会在 上执行Invalidate
诸如此类的操作Set()
,因此尽管在眼睛(和手指)上更容易,但通常最好使用完整部分恕我直言。