【问题标题】:Implicitly defines - conflict (Auto generated private field)隐式定义 - 冲突(自动生成的私有字段)
【发布时间】:2014-04-15 12:39:21
【问题描述】:

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

我知道,如果您有一个名为 e.g. P 然后名称 get_P 保留给 getter 方法,名称 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} 的字段并返回Test 类型的所有成员(包括NonPublic 字段),则可以清楚地看到自动生成的成员。

.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)

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

【问题讨论】:

  • 一个自动生成的属性创建 _P 变量作为支持字段,它允许您在本地引用它(P = someValue_p = someValue),就像任何其他属性一样。自动和手动实现的属性之间的代码确实没有太大区别。
  • @Plutonix 谢谢!您知道为自动生成的字段提供支持字段的目的吗?
  • 我在类内部使用了它,其中 P 可能会更改为 ReadOnly,因此当您更改它时几乎没有什么可更改的。可能还有与继承有关的原因,但我想不出一个场景

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


【解决方案1】:

这是因为您使用的是自动生成的属性。这些字段会自动生成为属性的支持字段。请参阅 VB 10 语言规范的第 9.7.4 节:

9.7.4 自动实现的属性

如果一个属性省略了任何访问器的声明,一个实现 除非在中声明该属性,否则将自动提供属性 一个接口或被声明为 MustOverride。只有读/写属性,没有 参数可以自动实现;否则,编译时错误 发生。

一个自动实现的属性 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

【讨论】:

  • 谢谢!这就解释了为什么我以前从未见过这种情况,因为我总是为每个属性创建自己的私有字段。当Field 被定义为WithEvents 时,你知道有一个支持字段的目的吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-28
  • 2017-09-14
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 2019-02-11
相关资源
最近更新 更多