In una classe, ClasseA, ho un oggetto timer. In questa classe registro i gestori di eventi per l'evento trascorso del timer. In un'altra classe, ClassB, ho un gestore di eventi pubblico per l'evento trascorso del timer. Così mi registro l'evento-handler da ClassB in ClasseA come segue:Cosa succede quando un evento si attiva e tenta di eseguire un gestore di eventi in un oggetto che non esiste più?
myTimer.Elapsed += ClassBInstance.TimerElapsed
Cosa succede se dovessi creare una nuova istanza di ClassBInstance e il timer trascorso evento viene generato quando l'istanza precedente di gestore di eventi di ClassB è ancora legato all'evento trascorso del timer?
Ad esempio:
ClassB classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
classBInstance = new ClassB();
myTimer.Elapsed += classBInstance.TimerElapsed
Infatti. In particolare, questo è il motivo per cui gli eventi statici sono così pericolosi; è molto facile mantenere vivo un vasto numero di oggetti se non si annulla la sottoscrizione religiosa. Almeno gli eventi di istanza muoiono con l'istanza che detiene il campo di appoggio - ma nessun GC per statica. –
Vale anche la pena ricordare che WPF salta attraverso i cerchi per evitarlo con WeakEvents che IMHO è troppo complicato e ha bisogno di un supporto linguistico. – Josh