Question

J'ai des problèmes avec, comme je l'ai dit, la définition de la propriété d'un bien immobilier. Disons que j'ai une classe qui représente une transaction. Dans ma classe, j'ai une propriété qui représente une autre classe, comme celle-ci:

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

Donc, j'ai essentiellement une propriété qui a un filtre get qui obtient la personne appropriée. Le problème est que lorsque je veux définir les informations de la personne par le biais de la propriété, VB semble ignorer que je l’ai même fait, comme ceci:

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

Mais quand je mets un oeil dessus, après avoir défini la propriété, ma valeur ne change pas. Je suis intriguée par ce comportement. Y a-t-il quelque chose que je fais mal? Merci!

Était-ce utile?

La solution

Chaque fois que vous obtenez un .MyPerson , la fonction Person.GetAppropriatePerson est appelée.

Je ne connais pas l'implémentation de cette fonction, mais je suppose qu'elle renvoie un nouvel objet Personne chaque fois qu'il est appelé.

Vous modifiez le nom d'une instance de personne. La prochaine fois que vous appelez .MyPerson , une autre instance de personne est renvoyée.

En fonction de la manière dont cela est supposé fonctionner, vous pouvez effectuer quelques opérations, par exemple:

  • Appelez GetAppropriatePerson dans le constructeur (si personid est connu à ce moment-là). Attribuez la valeur de retour à _myPerson et rendez la propriété MyPerson en lecture seule.
  • Ou initialisez _myPerson à null , puis, dans le MyPerson , obtenez un si _myPerson == null Alors _myPerson = GetAppropriatePerson etc. .

Autres conseils

Je ne sais pas s'il s'agit d'une erreur de copier / coller, mais vous semblez écraser _myPerson à chaque fois dans la partie Get de la propriété. Cela provoquerait plus que probablement votre " Quelque nom " pour être écrasé: -)

modifier Faites, codeape dit la même chose quelques secondes avant moi: -)

Un modèle courant pour l’initialisation paresseuse de propriétés comme celle-ci consiste à effectuer les opérations suivantes, qui vérifient si l’objet est null avant de l’écraser.

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

Vous devez modifier votre initialisation _myPerson pour qu'elle soit un dim _myPerson en tant que personne direct, plutôt que dim _myPerson en tant que nouvelle personne () aussi

Il doit être modifié par cette ligne: _myPerson = Person.GetAppropriatePerson (Me.PersonID)

parcourez votre code ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top