Frage

Ich habe Probleme mit, wie gesagt, eine Immobilie Eigenschaft festlegen. Lassen Sie uns sagen, dass ich eine Klasse, die eine Transaktion darstellt. In meiner Klasse habe ich eine Eigenschaft, die eine andere Klasse, wie dies entspricht:

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

So habe ich im Wesentlichen eine Eigenschaft, die einen get-Filter hat, das die entsprechende Person erhält. Das Problem ist, dass, wenn ich die Person, die Informationen über die Eigenschaft festlegen möchten, VB zu ignorieren scheint, dass ich es auch tat, wie folgt aus:

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

Aber wenn ich eine Uhr auf das setzen, nachdem die Eigenschaft festlegen, mein Wert nicht ändert. Ich bin von diesem Verhalten verwirrt. Gibt es etwas, was ich falsch mache? Dank!

War es hilfreich?

Lösung

Jedes Mal, wenn Sie eine get .MyPerson tun, wird die Funktion Person.GetAppropriatePerson genannt.

Ich weiß nicht, die Umsetzung dieser Funktion, aber ich würde vermuten, dass es ein neues Person-Objekt zurückgibt jedes Mal, dass sie aufgerufen wird.

Sie ändern den Namen einer Person Instanz. Das nächste Mal, wenn Sie .MyPerson aufrufen, wird eine andere Person Instanz zurückgegeben.

Je nachdem, wie das funktionieren sollte, könnten Sie ein paar Dinge tun, zum Beispiel:

  • Anruf GetAppropriatePerson im Konstruktor (wenn PersonID zu diesem Zeitpunkt bekannt ist). Weisen Sie den Rückgabewert _myPerson und die MyPerson Eigenschaft machen schreibgeschützt.
  • Oder initialisieren _myPerson null, dann im MyPerson Getter eine if _myPerson == null Then _myPerson = GetAppropriatePerson etc.

Andere Tipps

Ich weiß nicht, ob es sich um eine Kopie n Paste Fehler ist, aber Sie scheinen _myPerson in der ein Teil des Vermögens jedes Mal zu überschreiben Holen. Das wäre mehr als wahrscheinlich dazu führen, dass „ein Name“ zu bekommen überschreibt: -)

Bearbeiten do'h, codeape sagt die gleiche Sache Sekunden vor mir: -)

Ein gemeinsames Muster für faule Initialisierung von Eigenschaften wie das ist so etwas wie die folgenden zu tun, die überprüft, ob das Objekt vor dem Überschreiben ihm null ist.

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

Sie müssten Ihre _myPerson Initialisierung ändern, um eine gerade dim _myPerson as Person zu sein, anstatt dim _myPerson as New Person() zu

Es muss durch diese Linie geändert wird immer: _myPerson = Person.GetAppropriatePerson (Me.PersonID)

Schritt durch Sie Code ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top