tag net eventos evento eliminar ejemplo deshabilitar delegados crear c# events delegates

net - eventos y delegados c#



C#eliminando un controlador de eventos (2)

He estado haciendo esto por un tiempo, pero no me he dado cuenta de que he estado usando una new cada vez que elimino un controlador de eventos. ¿Se supone que estoy creando un nuevo objeto?

Básicamente, ¿hay una diferencia entre 1 y 2?

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDITAR: Bueno, esto es un duplicado. Lo siento por eso. Respuesta publicada here .

Dos delegados del mismo tipo con los mismos objetivos, métodos y listas de invocación se consideran iguales.


La segunda versión es equivalente a la primera; solo usa una sintaxis más corta. Esto fue implementado en C # 2.0


No hay diferencia entre 1 y 2, porque 2 es azúcar sintáctica para 1. Solo si 2 se refirieran a un campo de instancia de delegado de nivel de clase en lugar del nombre del método real, habría una diferencia en el IL compilado.

En términos de lo que sucede en el tiempo de ejecución, el método Remove del evento no parece importarle si la instancia delegada que se le transfiere es la misma que la que se pasó al método Add . No recuerdo por qué esto es así, pero supongo que las instancias de delegado siempre están internados.

EDITAR: Jon Skeet dice que el método de Remove del evento usa igualdad de valor ( Delegate.Equals ) para determinar qué delegado eliminar de la lista, en lugar de interning + igualdad de referencia. El mismo resultado final, método diferente. :-)