Не могу установить свойство собственности - PullRequest
2 голосов
/ 22 июня 2009

У меня проблемы с настройкой свойства объекта, как я уже сказал. Допустим, у меня есть класс, который представляет транзакцию. В моем классе есть свойство, представляющее другой класс, например:

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"

Но когда я ставлю часы на это, после установки свойства мое значение не меняется. Я озадачен этим поведением. Я что-то не так делаю? Спасибо!

Ответы [ 3 ]

7 голосов
/ 22 июня 2009

Я не знаю, является ли это ошибкой копирования и вставки, но вы, похоже, перезаписываете _myPerson каждый раз в части Get. Это, скорее всего, приведет к тому, что ваше «Some Name» будет перезаписано: -)

edit 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() слишком

4 голосов
/ 22 июня 2009

Каждый раз, когда вы получаете .MyPerson, вызывается функция Person.GetAppropriatePerson.

Я не знаю реализацию этой функции, но я думаю, что она возвращает новый объект Person каждый раз, когда она вызывается.

Вы изменяете Имя одного экземпляра Person. При следующем вызове .MyPerson будет возвращен другой экземпляр Person.

В зависимости от того, как это должно работать, вы можете сделать несколько вещей, например:

  • Вызовите GetAppropriatePerson в конструкторе (если personid известен в то время). Присвойте возвращаемое значение _myPerson и сделайте свойство MyPerson доступным только для чтения.
  • Или инициализируйте _myPerson до null, затем в MyPerson получателе есть if _myPerson == null Then _myPerson = GetAppropriatePerson etc.
1 голос
/ 22 июня 2009

Должно быть изменено этой строкой: _myPerson = Person.GetAppresponPerson (Me.PersonID)

пошагово проходи код ...

...