隐式定义 - 冲突(自动生成的私有字段)

时间:2014-04-15 12:39:22

标签: vb.net visual-studio-2010 .net-4.0

好的,所以我偶然发现了一个我不知道的自动生成的私人成员。

我知道如果你有一个名为例如 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)

那么有人知道为什么会产生这些字段和/或它们的目的吗?

1 个答案:

答案 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