2011-10-24 4 views
18

Nella MSDN Events Tutorial collegare agli eventi è dimostrato con l'esempio:Come funziona la rimozione di un gestore di eventi con - = lavoro quando viene specificato un "nuovo" evento

// Add "ListChanged" to the Changed event on "List": 
List.Changed += new ChangedEventHandler(ListChanged); 
... 
// Detach the event and delete the list: 
List.Changed -= new ChangedEventHandler(ListChanged); 

Dove come ho tenuto un riferimento al delegato. Esempio:

ChangedEventHandler myChangedEvent = new ChangedEventHandler(ListChanged); 
List.Changed += myChangedEvent; 
... 
List.Changed -= myChangedEvent; 

Quando guardo il codice di esempio MSDN, "- = new" sembra proprio sbagliato per me. Perché questo elenco ha un riferimento a un gestore di eventi che ho appena creato?

Ovviamente deve pensare le cose nel modo sbagliato? Posso ottenere un puntatore a una spiegazione tecnica di come - = funziona, vedendo come - = sembra non usarne una.

+1

correlati: http://stackoverflow.com/questions/7751247/c-sharp-why-shall-i-use-new-keyword-when-subscribing-for-an-event/7751271#7751271 – CodesInChaos

risposta

20

Sì, questo è confuzzling sintassi. Un oggetto delegato deve essere creato prima che il gestore possa essere rimosso dall'evento. Quale è il motivo per C# supporta questa sintassi così:

List.Changed -= ListChanged; 

che sembra più logico. Il compilatore tuttavia genera ancora lo stesso identico codice. Sotto il cofano, il metodo MulticastDelegate.RemoveImpl() itera l'elenco di chiamate e rimuove gli oggetti delegati da quell'elenco le cui proprietà Target e Method corrispondono.

+0

Hans - sono stai dicendo che il nuovo delegato non viene effettivamente creato quando si utilizza la sintassi '- = new'? (Io preferisco ancora il '-. = Sintassi Handler', penso che si legge molto meglio, ma è interessante sentire che il codice generato è identico sta a dimostrare ciò che un divario non ci può tra ciò che giusto e ciò che un compilatore moderno può generare !) – AAT

+0

No, viene sicuramente creato. Non viene utilizzato per nient'altro che un confronto, trovando una corrispondenza con il delegato originale che hai usato quando ti sei iscritto all'evento. Che ti risparmia dal dover mantenere quello in giro. Bello. Solo un pochino di spazzatura è il prezzo. –

+0

OK grazie per aver chiarito. – AAT

10

Evento unsubscribing utilizza l'uguaglianza valore, non riferimento uguaglianza. Quindi il delegato appena creato corrisponde a quello vecchio (sia l'oggetto di destinazione sia il metodo sono gli stessi) e rimuove quindi il vecchio delegato dall'elenco di richiami.

Problemi correlati