正如我所说,我在设置财产的财产时遇到了麻烦。假设我有一个代表事务的类。在我的类中,我有一个代表另一个类的属性,例如:

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"

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

有帮助吗?

解决方案

每次你执行 get 操作时 .MyPerson, , 功能 Person.GetAppropriatePerson 被叫。

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

您更改一个 Person 实例的名称。下次你打电话的时候 .MyPerson, ,返回另一个 Person 实例。

根据其工作原理,您可以做一些事情,例如:

  • 称呼 GetAppropriatePerson 在构造函数中(如果当时知道 personid)。将返回值赋值给 _myPerson, ,并使 MyPerson 属性只读。
  • 或者初始化 _myPersonnull, ,然后在 MyPerson 吸气剂有一个 if _myPerson == null Then _myPerson = GetAppropriatePerson etc.

其他提示

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

编辑 do'h,codeape在我面前说了几句话: - )

像这样延迟初始化属性的常见模式是执行类似下面的操作,在覆盖之前检查对象是否为null。

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作为Person ,而不是 dim _myPerson as New Person()

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

逐步完成代码...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top