2010-03-02 19 views

Respuesta

12

Así como + = te suscribe un controlador al evento, - = anula la suscripción.

Úselo cuando ya no desee que se llame a un controlador en particular cuando se produce un evento. A menudo solo necesita usarlo, el componente que plantea el evento es lógicamente más duradero que el controlador del evento: si no cancela la suscripción, el "evento que lo convoca" tiene efectivamente una referencia al manejador, por lo que puede mantenerlo activo durante más tiempo que usted quiere.

Como se señala en los comentarios:

  • -= sólo quitar un único controlador; si hay varios manejadores suscritos (incluso usando exactamente el mismo delegado), solo reducirá el conteo del manejador en 1. La última instancia del manejador especificado es la eliminada. (Por lo tanto, si anteriormente tenía los manipuladores A, B, A, suscritos en ese orden y eliminado A, terminaría con A, B, C.)
  • -= no causa un error si el manejador especificado no está suscrito al delegado ya; simplemente ignora la solicitud. Esto es cierto incluso si el evento no tiene controladores suscritos en este momento.
+6

+1. También vale la pena mencionar que no cancelar la suscripción a un evento suele ser la causa de que un programa se quede sin memoria, ya que impide que los objetos se conviertan en elegibles para GC. – RichardOD

+0

Jon, estoy un poco asustado por el hecho de que ambos comenzamos nuestras respuestas con "Así como ..." ;-) –

+0

¿Cuál es la versión de VB.NET de '- =' ... Quiero decir cómo cancelar la suscripción de un evento..? – dotNETbeginner

6

Al igual que puede agregar controladores de eventos a través de +=, puede eliminarlos a través de -=.

Por ejemplo:

mybutton.Click += new EventHandler(myhandler); 

posteriormente puede eliminar de esta manera:

mybutton.Click -= new EventHandler(myhandler); 

... porque los controladores de eventos para el mismo método y la instancia son equivalentes (por lo que no es necesario retener una referencia al manejador que usó con += y usar esa con -=).

3

Los += y -= operadores pueden utilizarse en C# para añadir/eliminar controladores de eventos a/desde uno de los eventos de un objeto:

// adds myMethod as an event handler to the myButton.Click event 
myButton.Click += myMethod; 

Después de ejecutar el código anterior, el método myMethod será llamado cada vez myButton se hace clic.

// removes the handler 
myButton.Click -= myMethod; 

Después de ejecutar el código anterior, al hacer clic en myButton ya no causar myMethod a ser llamado.

1

Sospecho que la lógica de fondo de + = es para agregar el controlador a una lista/matriz de manejadores de eventos para el evento dado. Cuando se usa - =, compara su argumento de la mano derecha con la lista de controladores de eventos que tiene para este evento y lo elimina de la lista. Si haces múltiples + = para un evento dado, se llamará a cada controlador.

Dicho de manera diferente: + = significa agregar un método a la lista de métodos para llamar cuando se produce el evento. - = significa eliminar el método especificado de la lista de métodos para llamar.

Si se eliminan todos, el evento no tendrá controladores y el evento será ignorado.