2009-06-22 223 views
2

正如我所說,我遇到了設置屬性屬性的問題。比方說,我有一個代表交易的類。在我的課堂我有一個代表另一個類的屬性,比如這個:無法設置屬性的屬性

Public Class PersonRecord 

    _myPerson = new Person() 

    Public Property MyPerson as Person 
    Get 
     _myPerson = Person.GetAppropriatePerson(Me.PersonID) 

     return _myPerson 
    End Get 

    Set 
     _myPerson = value 
    End Set 
    End Property 

所以我基本上是有一個具有一個get過濾器,得到合適的人的屬性。問題是,當我想設置通過屬性的人的信息,VB似乎忽略我甚至做到了,比如這個:

Me.myPersonRecord.Person.Name = "Some Name" 

但是,當我把手錶放在這之後,設置該屬性,我的價值不會改變。我對這種行爲感到困惑。有什麼我做錯了嗎?謝謝!

回答

4

每當您執行獲取.MyPerson時,函數Person.GetAppropriatePerson被調用。

我不知道該函數的實現,但我猜測它每次調用它時都會返回一個新的Person對象。

您更改了一個Person實例的名稱。下次您撥打.MyPerson時,會返回另一個Person實例。在構造函數中

  • 呼叫GetAppropriatePerson(如果PERSONID在那個時候知道):

    根據這是如何工作的,你可以做一些事情,例如。將返回值分配給_myPerson,並使MyPerson屬性爲只讀。

  • 或初始化_myPersonnull,然後在MyPerson吸氣有if _myPerson == null Then _myPerson = GetAppropriatePerson etc.
+1

啊,我明白你在說什麼了。但是,我沒有看到任何解決方法,除非我刪除getter,並且每次我想要獲取該屬性的適當客戶名稱時都使用一個函數。 – Austin 2009-06-22 13:57:11

+0

上面的選項2如何?請參閱@Dan F的答案,瞭解MyPerson屬性的完整示例。 – codeape 2009-06-22 14:17:45

7

我不知道這是否是一個複製ñ粘貼錯誤,但是你出現在的獲取部分每次都被覆蓋_myPerson財產。這將更有可能導致您的「有些名稱」來獲得覆蓋:-)

編輯do'h,codeape說我之前同樣的事情秒:-)

懶惰的常見模式像這樣的屬性的初始化是做下面的事情,在覆蓋它之前檢查對象是否爲空。

Public Property MyPerson as Person 
Get 
    If _myPerson Is Nothing Then 
     _myPerson = Person.GetAppropriatePerson(Me.PersonID) 
    End If 
    return _myPerson 
End Get 

你不得不改變你的_myPerson初始化是直dim _myPerson as Person,而不是dim _myPerson as New Person()

1

必須得到由該行改變了: _myPerson = Person.GetAppropriatePerson(Me.PersonID)

一步一步通過你的代碼...