2011-12-12 17 views
6

¿Por qué tengo que usar lo siguiente para separar un evento?¿Por qué el operador "nuevo" está trabajando para separar un controlador de eventos usando - =?

object.myEvent -= new MyEvent(EventHandler); 

yo soy un poco de lo irritado que la nueva operador está trabajando.

¿Alguien puede explicarlo?

actualización

ya sé que yo no tengo que utilizar el nuevo operador para separar los acontecimientos, pero sigue siendo el auto sugerencia completa en Visual Studio 2010. Mi verdadera pregunta es cómo lo hace - = nuevo trabajo para el proceso de separación. ¿Cómo puede un nuevo objeto/delegado hacer coincidir un objeto/delegado creado anteriormente en el lado + =?

Respuesta

12

No tiene que utilizar el operador new. No ha tenido que desde C# 2.0 salió:

foo.SomeEvent += EventHandler; 
foo.SomeEvent -= EventHandler; 

Este utiliza un método de conversión de grupo para crear un delegado del grupo método (el nombre del método). Esto no es sólo para los eventos, ya sea:

Action<string> writeToConsole = Console.WriteLine; 

EDIT: En cuanto a la forma en funciona:

  • Usando -= en un evento sólo termina llamando el descriptor de acceso "eliminar", que por lo general -= utiliza en un delegado ... (al menos de manera efectiva)
  • Usando -= de un delegado es el azúcar sintáctica para Delegate.Remove
  • Delegate.Remove utiliza delegar la igualdad - dos instancias de delegado son iguales si tienen el mismo método y la misma instancia de destino (por métodos de instancia)

Nota que el uso de una conversión grupo método todavía creará una nueva instancia del delegado cada vez revisas el código

+0

Bien, "Entonces, ahora estoy irritado, tengo que usar un + = y luego un - =, ¿qué da?" ;-) –

+0

Gracias por su respuesta, pero ¿puede darme más detalles? Sé que no tengo que usar nuevo. Pero sigue siendo el autocompletado en Visual Studio 2010. (si escribe foo.SomeEvent + = Visual Studio sugiere hacer + = nuevo ... Me gustaría saber cómo .NET maneja la separación interna. ¿Cómo puede un nuevo operador coincidir? un objeto/delegado creado anteriormente? – Grrbrr404

+0

@ Grrbrr404: Editado adecuadamente. Puede considerar volver a plantear su pregunta, si sabe que no tiene que usar el nuevo operador para separar un evento, una pregunta de "¿Por qué tengo usar "nuevo" para separar un manejador de eventos usando - =? "parece bastante extraño. –

Cuestiones relacionadas