Stellen Sie nicht die Immobilie Property
-
06-07-2019 - |
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!
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 dieMyPerson
Eigenschaft machen schreibgeschützt. - Oder initialisieren
_myPerson
null
, dann imMyPerson
Getter eineif _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 ...