2009-06-22 7 views
2

Ich habe Probleme mit, wie ich sagte, die Eigenschaft einer Eigenschaft festlegen. Nehmen wir an, ich habe eine Klasse, die eine Transaktion darstellt. In meiner Klasse habe ich eine Eigenschaft, die eine andere Klasse, wie dies entspricht:Eigenschaft der Eigenschaft kann nicht festgelegt werden

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 eine 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 dies:

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

Aber wenn ich eine Uhr auf das setzen, nachdem die Eigenschaft festlegen Mein Wert ändert sich nicht. Ich bin verwirrt über dieses Verhalten. Gibt es etwas, was ich falsch mache? Vielen Dank!

Antwort

4

Jedes Mal, wenn Sie eine get .MyPerson bekommen, wird die Funktion Person.GetAppropriatePerson aufgerufen.

Ich kenne die Implementierung dieser Funktion nicht, aber ich würde vermuten, dass es jedes Mal, wenn es aufgerufen wird, ein neues Person-Objekt zurückgibt.

Sie ändern den Namen einer Person-Instanz. Wenn Sie das nächste Mal .MyPerson aufrufen, wird eine weitere 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 zu und machen Sie die Eigenschaft schreibgeschützt.
  • Oder initialisieren _myPerson zu null, dann im MyPerson Getter haben eine if _myPerson == null Then _myPerson = GetAppropriatePerson etc.
+1

Ah, ich sehe was du sagst. Ich sehe jedoch keinen Weg, wenn ich den Getter nicht entferne und nur jedes Mal eine Funktion benutze, wenn ich den passenden Kundennamen der Unterkunft erhalten möchte. – Austin

+0

Wie wäre es mit Option zwei oben? In der Antwort von @Dan F finden Sie ein vollständiges Beispiel dafür, wie Ihre MyPerson-Eigenschaft aussehen sollte. – codeape

+0

Hey, das hat funktioniert!Ich kann nicht glauben, dass ich nicht daran dachte, die einfache if-Anweisung zu machen, um nach einer Null zu suchen. Vielen Dank! – Austin

7

Ich weiß nicht, ob es sich um eine Kopie n Paste Fehler ist, aber Sie scheinen _myPerson jedes Mal in dem Get Teil zu Überschreiben von die Eigenschaft. Das wäre mehr als wahrscheinlich dazu führen, dass „ein Name“ überschreibt :-)

bearbeitendo'h zu bekommen, sagt codeape die gleiche Sache Sekunden vor mir :-)

Ein gemeinsames Muster für faul Die Initialisierung von Eigenschaften wie dieser soll etwas wie folgt tun, das überprüft, ob das Objekt null ist, bevor es überschrieben wird.

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, anstatt dim _myPerson as New Person() zu

+0

Danke! Ich schätze die Hilfe, aber Codeape ist erst da;) Aber es ist beruhigend, dass ich ein Muster verwende, das ich nicht einmal realisiert habe. Ich habe mich immer gefragt, wie faul Initialisierung verwendet wurde. – Austin

+0

Keine Sorge, froh, dass es geholfen hat :-) –

1

es sein muss durch diese Linie geändert werden immer: _myPerson = Person.GetAppropriatePerson (Me.PersonID)

Schritt durch Sie Code ...