2014-04-15 26 views
0

好吧,所以我偶然發現了一個我不知道的自動生成的私有成員。隱式定義 - 衝突(自動生成的私有字段)

我知道如果你有一個名爲例如P然後名稱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」,其具有相同名稱的成員在類「測試衝突」。

2)WithEvents變量「FWE」隱式地定義「_fWE」,這與在類「測試」的相同名稱的成員衝突。

如果我刪除所有命名_{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) 

那麼有人知道爲什麼這些字段是生成和/或他們的目的?

+0

一個自動生成的屬性創建的_P變量作爲後備字段,它允許你本地引用它('P = someValue'或'_p = someValue')就像任何其他屬性一樣。自動和手動實現的屬性之間的代碼真的沒有太大區別。 – Plutonix

+0

@Plutonix謝謝!您是否知道爲自動生成的字段設置後臺字段的目的? –

+0

我已經在內部使用它在P可能會更改爲ReadOnly的類中,因此在您更改它時幾乎沒有任何更改。可能還有與繼承有關的原因,但我不能想到場景 – Plutonix

回答

0

這是因爲您正在使用自動生成的屬性。這些字段將自動生成爲屬性的後備字段。見VB 10 Lanugage規格的第9.7.4節:

9.7.4自動實現的屬性

如果屬性忽略任何存取的聲明中, 屬性的實現會自動除非屬性提供在 中聲明瞭一個接口或被聲明爲MustOverride。只有讀/寫屬性沒有 參數可以自動實現;否則,發生編譯時錯誤 。

一種自動執行屬性x,甚至一個覆蓋另一個 屬性,引入了一個私人局部變量_x與相同類型 屬性。如果局部變量名稱與另一個聲明之間存在衝突,則會報告編譯時錯誤。

的 自動實現的屬性的Get訪問返回 當地的,設置局部的價值的價值和屬性的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 
+0

謝謝!這解釋了爲什麼我以前從未見過這種情況,因爲我總是爲每個屬性創建自己的私人字段。當'Field'被定義爲'WithEvents'時,你知道有一個支持字段的目的嗎? –