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

所以我基本上有一个属性,它有一个获取合适的人的过滤器。问题是,当我想通过属性设置 Person 的信息时,VB 似乎忽略了我什至这样做,例如:

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

但是当我对此进行观察时,设置属性后,我的值不会改变。我对这种行为感到困惑。有什么我做错了吗?谢谢!

4

3 回答 3

7

我不知道这是否是复制粘贴错误,但您似乎_myPerson每次都在属性的 Get 部分覆盖。这很可能会导致您的“某个名称”被覆盖:-)

编辑 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()

于 2009-06-22T13:49:25.040 回答
4

每次执行 get时,都会调用.MyPerson该函数。Person.GetAppropriatePerson

我不知道该函数的实现,但我猜它每次调用它都会返回一个新的 Person 对象。

您更改了一个 Person 实例的名称。下次调用时.MyPerson,会返回另一个 Person 实例。

根据这应该如何工作,您可以做一些事情,例如:

  • 调用GetAppropriatePerson构造函数(如果当时已知 personid)。将返回值分配给_myPerson,并使MyPerson属性只读。
  • 或初始化_myPersonnull,然后在MyPersongetter 中有一个if _myPerson == null Then _myPerson = GetAppropriatePerson etc.
于 2009-06-22T13:49:23.107 回答
1

它必须被这一行改变:_myPerson = Person.GetAppropriatePerson(Me.PersonID)

逐步执行您的代码...

于 2009-06-22T13:50:21.467 回答