plantilla pagina page net maestra asp c# events event-handling

c# - page - pagina maestra asp net



¿Cómo funciona la eliminación de un controlador de eventos con-= cuando se especifica un evento "nuevo"? (2)

En el Tutorial de eventos de MSDN, la conexión a eventos se demuestra con el ejemplo:

// 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);

Donde 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 mal. ¿Por qué esta lista tendría una referencia a un controlador de eventos que acabo de crear?

Obviamente debo estar pensando en las cosas de la manera equivocada? ¿Puedo obtener un puntero a una explicación técnica de cómo - = funciona, ver cómo - = parece no estar usando una?


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


Sí, esto es confuzzling sintaxis. Se debe crear un objeto delegado antes de que el controlador se pueda eliminar del evento. Es por eso que C # soporta esta sintaxis también:

List.Changed -= ListChanged;

Lo que parece más lógico. Sin embargo, el compilador todavía genera exactamente el mismo código. Bajo el capó, el método MulticastDelegate.RemoveImpl () itera la lista de invocación y elimina los objetos delegados de esa lista cuyas propiedades de Objetivo y Método coinciden.