Laden...

Lebensdauer eines Objekts das nur durch einen Delegaten referenziert wird

Erstellt von chilic vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.377 Views
C
chilic Themenstarter:in
2.121 Beiträge seit 2010
vor 10 Jahren
Lebensdauer eines Objekts das nur durch einen Delegaten referenziert wird

Hallo ihr alle

Ich hätte eine grundsätzliche Frage, bin mir nicht ganz sicher wie folgender Sachverhalt zu sehen ist.
Ich erzeuge ein Objekt, von dem am Ende nur eine an einen Eventhandler zugewiesene Methode übrig bleibt. Diese Methode benötigt Felder des Objekts. Wenn das Event aufgerufen wird gibt es die Referenz auf das Objekt längst nicht mehr.

Nach meinem Verständnis steckt die Referenz auf das Objekt noch mit im Event, so dass der GC mein Objekt nicht aufräumt solange die Methode aufgerufen werden könnte.
Liege ich da richtig oder hab ich was übersehen?

Gelöschter Account
vor 10 Jahren

Wenn das Event aufgerufen wird gibt es die Referenz auf das Objekt längst nicht mehr

Verstehe ich dich richtig, das Event wird gefeuert, die feuernde Instanz ist aber bereits tot? (Wenns nur an der Referenz liegt, dafür hat man ja als erstes argument den sender, sowie es empfohlen wird)

Evtl. als Failback Strategie geeignet:
GC.KeepAlive

S
248 Beiträge seit 2008
vor 10 Jahren

Hallo chilic,

die Referenz auf das Objekt wird in dem dabei erzeugten Delegate mit gespeichert.
Der Delegate enthält immer eine Referenz auf die aufzurufene Methode. Ist die Methode nicht statisch, so enthält er zusätzlich noch das Objekt für welches die Methode aufgerufen werden soll.

Grüße
spooky

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo chilic,

Delegate.Target referenziert das Objekt. Solange der Delegat lebt, lebt also auch das Objekt. GC.KeepAlive braucht man also nicht. Generell werden Objekte erst freigegeben, wenn sie nicht mehr benötigt werden. Das Objekt wird aber (potenziell) solange benötigt, wie die Delegat benötigt wird.

herbivore

4.221 Beiträge seit 2005
vor 10 Jahren

Aber wo ist jetzt Dein Problem ?

Habe ich das richtig verstanden:

1.- Code X erstellt Instanz von A
2.- Code X erstellt Instanz von B
3.- A += Event von B
5.- Code X droppt A

Nun ist A nicht mehr aus X referenziert
Aber A ist aus B referenziert (über den Delegate)

Derjenige welcher ein Event abonniert muss es auch wieder löschen bevor er das Objekt wegschmeisst.

Somit einfach folgendes noch nachlegen

4.- Code X A-= Event von B

Events musst Du immer abhängen (ausser Du lässt beide Seiten gleichzeitig sterben (z.B: Form hat Events eines Controls... wenn Du da das Form wegschmeisst, dann werden auch die Controls weggeschmissen).

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

C
chilic Themenstarter:in
2.121 Beiträge seit 2010
vor 10 Jahren

Hallo
Vielen Dank für die Antworten, das bestätigt meine Vermutung. Wollte nur sicher gehen.

ber A ist aus B referenziert (über den Delegate)

Genau das war der Punkt über den ich mir nicht so ganz im klaren war.
Aber so gesehen ist es schon logisch, um ein Event auf einem Objekt auszuführen muss das Objekt ja irgendwo noch hängen.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo Programmierhans,

1.- Code X erstellt Instanz von A
2.- Code X erstellt Instanz von B
3.- A += Event von B
5.- Code X droppt A

Nun ist A nicht mehr aus X referenziert
Aber A ist aus B referenziert (über den Delegate)

ich finde die Pseudocode-Schreibweise "A += Event von B" so verwirrend, weil sich A und B genau auf der anderen Seite des += befinden, als bei der Realcode-Schreibweise, dass ich es doch noch gerne klarstellen möchte. Die Aussage am Ende stimmt nur, wenn mit "A += Event von B" folgendes gemeint ist:

b.MyEvent += a.MyEventHandler;

oder im Code von A

b.MyEvent += this.MyEventHandler; // das Schlüsselwort this könnte auch weggelassen werden

Wobei MyEvent ein Event von B ist und MyEventHandler eine Methode von A. Und wobei a bzw. this auf eine Instanz von A referenziert und b auf eine Instanz von B. Nur dann wird die Instanz von A (indirekt über den Delegaten) von der Instanz von B referenziert. Eine Referenzierung in die andere Richtung gibt es alleine durch das Registrieren des EventHandler nicht.

herbivore