2011-10-24 11 views
18

En el MSDN Events Tutorial conectar a los eventos se demuestra con el ejemplo:¿Cómo funciona la eliminación de un controlador de eventos con - = trabajo cuando se especifica un "nuevo" 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); 

Cuando, como he estado manteniendo una referencia al delegado Ejemplo:

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

Cuando miro el código de ejemplo de MSDN, "- = new" simplemente me parece incorrecto. ¿Por qué esta lista tiene una referencia a un controlador de eventos que acabo de crear?

Obviamente, ¿debo pensar las cosas de la manera incorrecta? ¿Puedo obtener un puntero a una explicación técnica de cómo - = funciona, viendo cómo - = parece no usar uno.

+1

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

Respuesta

20

Sí, esto es una sintaxis confusa. Se debe crear un objeto delegado antes de que el controlador pueda eliminarse del evento. Por eso C# también admite esta sintaxis:

List.Changed -= ListChanged; 

que se ve más lógico. Sin embargo, el compilador aún genera exactamente el mismo código. Debajo del capó, el método MulticastDelegate.RemoveImpl() itera la lista de invocación y elimina los objetos delegados de esa lista cuyas propiedades Target y Method coinciden.

+0

Hans - are ¿Estás diciendo que el nuevo Delegado no se creó cuando se usa la sintaxis '- = new'? (Todavía prefiero la sintaxis '- = Handler', creo que se lee mucho mejor, pero es interesante escuchar que el código generado es idéntico. Va a mostrar la brecha que puede existir entre lo que está bien y lo que un compilador moderno puede generar !) – AAT

+0

No, definitivamente se crea. No se usa para otra cosa que no sea una comparación, encontrar una coincidencia con el delegado original que usaste cuando te suscribiste al evento. Lo que le ahorra tener que mantener ese alrededor. Bonito. Solo un poquito de basura es el precio. –

+0

OK gracias por aclarar. – AAT

10

La anulación de la suscripción de eventos usa igualdad de valores, no igualdad de referencia. De modo que el delegado recién creado coincide con el antiguo (tanto el objeto como el método son los mismos) y, por lo tanto, elimina el antiguo delegado de la lista de invocación.

Cuestiones relacionadas