Ihre Situation ist in Ordnung; das Ereignis Teilnehmer wird nicht verhindern, dass die Herausgeber aber auch das Gegenteil kann der Fall sein.
Zum Beispiel,
class Foo
{
public event EventHandler FooEvent;
void LeakMemory()
{
Bar bar = new Bar();
bar.AttachEvent(this);
}
}
class Bar
{
void AttachEvent(Foo foo)
{
foo.FooEvent += (sender, e) => { };
}
}
In diesem Fall wird die Instanz von Bar
erstellt innerhalb LeakMemory
kann nicht eingezogen werden, bis entweder
- Die anonyme Methode, die durch das Lambda dargestellt wird, wird aus
FooEvent
die Liste der Aufrufe
- Die Instanz von Foo, an die sie angehängt ist, kann gesammelt werden
Der Grund dafür ist, dass das Ereignis (das nur ein syntaktischer Zucker für eine gewöhnliche delegate
Instanz) hält eine Liste von Delegierten, die aufgerufen werden, wenn sie aufgerufen wird, und jeder dieser Delegierten hat wiederum einen Verweis auf das Objekt, an das er angehängt ist (in diesem Fall die Instanz von Bar
).
Beachten Sie, dass wir hier nur über die Sammlung Förderungswürdigkeit hier. Nur weil es förderfähig ist, heißt das noch lange nicht, dass wenn (oder sogar, wirklich, wenn ) es wird gesammelt, nur dass es kann sein.