2009-06-22 147 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)

一步一步通过你的代码...