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?
ethernetdevice.PcapOnPacketArrival -= new SharpPcap.PacketArrivalEvent(ArrivalResponseHandler);
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. :-)