2009-09-28 24 views
26

He estado haciendo esto por un tiempo, pero no he notado que he estado usando un new cada vez que elimino un controlador de eventos. ¿Se supone que estoy creando un nuevo objeto?C# eliminación de un controlador de eventos

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

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

  2. ethernetdevice.PcapOnPacketArrival -= ArrivalResponseHandler;

EDIT: bien este es un duplicado. Lo siento por eso. Responder publicado here.

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

Respuesta

29

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 alguna diferencia? en el compilado IL.

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 de delegado que se le pasa 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.

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

+0

Dado que un delegado es solo una referencia a un método y una instancia (opcional), la comparación de estos dos debería ser suficiente para determinar la igualdad. – Botz3000

+0

Sí, pero en general, si llama dos veces '' nuevo T() 'en un tipo de referencia arbitrario, obtendrá dos instancias diferentes. Dado que este no parece ser el caso para los delegados, deduzco que el constructor delegado está internando automáticamente las instancias al igual que la clase 'Tipo'. –

+0

interno, ¿qué significa eso? Gracias por la respuesta. Este tipo de respuesta aborda la duda que tenía. Me estaba preguntando acerca de eso nuevo ya que estoy creando una nueva instancia cuando agrego un controlador y creo uno nuevo cuando lo elimino. Muy raro. – Sharun

13

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

Cuestiones relacionadas