Diciamo che ho una classe A che può sparare un evento chiamato X. Ora ho una classe B e in un metodo ottengo un esempio per A e legare l'evento a un gestore in B:Come sbarazzarsi degli handler di eventi in modo sicuro?
public void BindEvent(A a)
{
a.X += AEventHandler;
}
Ho tre domande a riguardo.
È vero che quando ora ho impostato il riferimento all'istanza B NULL, non sarà garbage collection poiché il garbage collector pensa che sia ancora in uso (mantenendo così un inutile e potenzialmente interferenti copia B in memoria).
Che dire quando ho un altro oggetto c (di classe C) in cui ho un riferimento a A chiamato ("this.a = new A()"). Quindi chiamo "b.BindEvent (this.a)", e in c ho impostato il riferimento a a a null ("this.a = null"). Questo manterrà la copia di A in memoria perché è referenziata attraverso l'evento in b?
Se uno o entrambi sono vere di quanto sopra, come posso aggirare meglio questi problemi? Se ho un intero elenco di gestori di eventi (diciamo 10 righe come "a.SomeEvent + = SomeMethod") dovrei ripulirli tutti di nuovo ("a.SomeEvent - = SomeMethod"). In quale momento o luogo nel codice dovrei fare queste cose?
Beh, è diventato un po 'confuso ma non sono sicuro di come spiegare in un modo migliore. Per favore lascia un commento se ho bisogno di spiegare qualcosa di più dettagliato.
Sono abbastanza sicuro che 2 non è corretto. Innanzitutto, l'evento * mai * mantiene vivo l'editore ('A') - e in secondo luogo, nulla può vedere' A' comunque ... quindi i dati vengono disconnessi e raccolti. –
Doh! Sono corretto. :-) –