2016-10-29 42 views
0

Ich habe eine globale Variable:Umfang Ereignishandler nach Objektinstanziierung wieder

Public myPerson As New Person 

Dann lege ich ein Event-Handler:

AddHandler myPerson.OnClose, AddressOf DoWhatever 

Dann woanders im Programm neu ich mein Objekt:

Wird mein Event-Handler immer noch an den neuen myPerson angehängt, oder muss ich ihn erneut hinzufügen?

Antwort

1

Wird mein Event-Handler immer noch an den neuen myPerson angehängt oder muss ich ihn erneut hinzufügen?

Event-Handler sind für jede Instanz der Klasse spezifisch. Wenn Sie tun, instanziieren Sie eine vollständig neue Instanz der Person-Klasse, die über eigene Verweise, Variablen und Ereignisse verfügt.

Denken Sie daran, nur weil Sie auf die gleiche Variable verweisen, heißt das nicht, dass es dieselbe Klasseninstanz ist. Eine Klasseninstanz kann durch mehrere Variablen referenziert werden. Zum Beispiel hier:

Dim Person1 As New Person 
Dim Person2 As Person = Person1 
Dim Person3 As Person = Person1 

AddHandler Person1.OnClose, AddressOf DoWhatever 

alle drei Variablen beziehen sich auf die gleiche Instanz der Person Klasse. Wenn Sie also unter Person3 etwas aufrufen, das das Ereignis OnClose auslöst, wird der Ereignishandler trotzdem aufgerufen.

Wenn die Antwort -kein wird es

Der Handler nur angeordnet werden, entsorgt werden/gelöst, wenn Sie es manuell lösen, oder wenn der Garbage Collector verfügt/sammelt Ihre erste Instanz. In meinem obigen Beispiel wird durch das Wiederherstellen/Ändern von Person1 der Ereignishandler nicht entfernt, da Person2 und Person3 immer noch auf die Klasseninstanz verweisen.

Diese Geige zeigt, was ich rede: https://dotnetfiddle.net/8XiH19

Wie Sie die einzige Person geschlossen sehen berichtet John, von Person2 verwiesen, während myPerson.Close() auf der neu instanziiert Anrufers ergab nichts.

Was wäre, wenn ich den gleichen Handler wieder hinzufügen würde, würde es dann zweimal aufgerufen werden, da ich zwei gleiche Handler zweimal angeschlossen hätte?

No. Wie oben gesagt die Ereignisbehandlungsroutine zu die Klasseninstanz spezifisch ist, nicht die Variable.

+0

Sie sagten 'Klasse' mehrere Zeit, wo' Instanz' wäre besser geeignet. Das kann irreführend sein – Sehnsucht

+0

@Sehnsucht: Ist das besser? Ich wechselte zu den Wörtern "Klasseninstanz" anstatt nur "Instanz", weil ich das noch klarer fühlte. Vielen Dank für Ihr Feedback.:) –

+1

scheint mir ok :) – Sehnsucht