好的,所以我偶然发现了一个我不知道的自动生成的私人成员。
我知道如果你有一个名为例如 P
,然后为getter方法保留名称 get_P
,并保留名称 set_P
对于setter方法。
但我不知道的是名称 _P
也是保留的。这似乎只适用于属性(不是ReadOnly
/ WriteOnly
)而字段定义为WithEvents
。
Public Class Test
Public Property p As Object
Public WriteOnly Property pW() As Object
Set(value As Object)
End Set
End Property
Public ReadOnly Property pR() As Object
Get
End Get
End Property
Public f As Object
Public WithEvents fWE As Object
Private _p As Object
Private _pW As Object
Private _pR As Object
Private _f As Object
Private _fWE As Object
End Class
上述类将产生以下错误:
1) 属性'p'隐式定义'_p',它与'Test'类中同名的成员冲突。
2) WithEvents变量'fWE'隐式定义'_fWE',它与'Test'类中同名的成员冲突。
如果我删除名为_{name}
的所有字段并返回NonPublic
类型的所有成员(包括Test
字段),则可以清楚地看到自动生成的成员。
.cctor (Constructor)
.ctor (Constructor)
__ENCAddToList (Method)
__ENCList (Field)
_fWE (Field) <------------------------------- *2
_p (Field) <---------------------------------- *1
Equals (Method)
f (Field)
Finalize (Method)
fWE (Property)
get_fWE (Method)
get_p (Method)
get_pR (Method)
GetHashCode (Method)
GetType (Method)
MemberwiseClone (Method)
p (Property)
pR (Property)
pW (Property)
set_fWE (Method)
set_p (Method)
set_pW (Method)
ToString (Method)
那么有人知道为什么会产生这些字段和/或它们的目的吗?
答案 0 :(得分:0)
这是因为您正在使用自动生成的属性。这些字段将自动生成为属性的支持字段。参见VB 10 Lanugage Spec的第9.7.4节:
9.7.4自动实施属性
如果属性省略了任何访问器的声明,则执行 除非声明财产,否则将自动提供财产 接口或声明为MustOverride。只有读/写属性没有 参数可以自动实现;否则,编译时错误 发生。
自动实现的属性x,甚至一个覆盖另一个属性 property,引入一个私有局部变量_x,其类型与 属性。如果本地变量的名称与之间存在冲突 另一个声明,将报告编译时错误。
在 自动实现的属性的Get访问器返回的值 local和属性的Set访问器设置本地的值。
例如,声明:
Public Property x() As Integer
大致相当于:
Private _x As Integer
Public Property x() As Integer
Get
Return _x
End Get
Set (value As Integer)
_x = value
End Set
End Property