2009-09-28 18 views
26

L'ho fatto per un po ', ma non ho notato che ho utilizzato un new ogni volta che rimuovo un gestore di eventi. Dovrei creare un nuovo oggetto?C# rimozione di un gestore di eventi

Fondamentalmente c'è una differenza tra 1 e 2?

  1. ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: Va bene questo è un duplicato. Mi dispiace per quello Risposta postata here.

Due delegati dello stesso tipo con gli stessi obiettivi, metodi e elenchi di chiamata sono considerati uguali.

risposta

29

Non c'è differenza tra 1 e 2, perché 2 è zucchero sintattico per 1. Solo se 2 si riferisce a un campo di istanza di un delegato a livello di classe invece del nome di metodo effettivo ci sarebbe una differenza nella IL compilata.

In termini di ciò che accade in fase di esecuzione, il metodo dell'evento Remove non sembra preoccuparsi del fatto che l'istanza delegata passata sia uguale a quella passata al metodo Add. Non riesco a ricordare perché sia ​​così, ma suppongo che le istanze delegate siano sempre internate.

EDIT: Jon Skeet dice che il metodo evento Remove utilizza l'uguaglianza valore (Delegate.Equals) per determinare quale delegato per rimuovere dalla lista, piuttosto che internato + uguaglianza di riferimento. Stesso risultato finale, metodo diverso. :-)

+0

Poiché un delegato è solo un riferimento a un metodo e un'istanza (facoltativa), il confronto di questi due dovrebbe essere sufficiente per determinare l'uguaglianza. – Botz3000

+0

Sì, ma in generale, se si chiama 'new T()' due volte su un tipo di riferimento arbitrario, si otterrebbero due istanze diverse. Poiché ciò sembra non essere il caso per i delegati, deduco che il costruttore delegato stia internando automaticamente le istanze proprio come fa la classe 'Type'. –

+0

internato: cosa significa? Grazie per la risposta. Questo tipo di risposta al dubbio che ho avuto. Mi stavo chiedendo di quello nuovo mentre sto creando una nuova istanza quando aggiungo un gestore e ne creo uno nuovo quando lo rimuovo. Molto strano. – Sharun

13

La seconda versione è equivalente alla prima; usa solo una sintassi più breve. Questo è stato implementato in C# 2.0

Problemi correlati