2010-06-07 10 views
5

En todos los ejemplos que puedo encontrar, así como el código generado automáticamente i Visual Studio, los acontecimientos se establecen con el siguiente código:Lo que el propósito/diferencia en el uso de un tipo de evento constructor

button1.Click += new System.EventHandler(this.button1_Click); 

Pero no puedo también escríbalo visualmente más limpio al omitir el contenedor del constructor:

button1.Click += this.button1_Click; 

que también compilan bien.

¿Cuál es la diferencia entre estos dos? ¿Y por qué es el primero más utilizado/preferido?

Respuesta

5

El segundo formulario (conversión implícita de grupo de métodos a un tipo de delegado) no era compatible antes de C# 2, por lo que cualquier tutorial escrito antes de 2005 habría usado el primer formulario.

Además, IIRC Visual Studio completa automáticamente el primer formulario. Personalmente prefiero el segundo.

2

El segundo es el azúcar sintáctico que se expande al primero, a través de la magia del compilador.

Puede preferirse la primera porque el tipo de evento no está oculto del código y, por lo tanto, podría ser más fácil de leer más adelante, pero funcionalmente (e IL-wise) son lo mismo.

+0

Ts, nada es mágico con las computadoras, ni siquiera aleatorio. – Patrick

+0

"Cualquier tecnología suficientemente avanzada es indistinguible de la magia" - ACC –

2

Se está eliminando controladores de eventos que inspiraron el azúcar:

button1.Click -= new System.EventHandler(this.button1_Click); 

Usando nueva a eliminar un controlador de eventos? Sí.

Incluso la sintaxis completa del constructor delegado es sugar. Un delegado necesita un Método y un Objetivo. El objetivo se asigna automáticamente sin que usted lo especifique. Será "esto". Un poco desafortunado, oculta el hecho de que una suscripción a eventos agrega una referencia a su objeto de clase que puede evitar que se recolecte basura. Es explícito en la sintaxis de C++/CLI:

button1->Click += gcnew System::EventHandler(this, &button1_Click); 

con el giro interesante que en realidad se podría suscribir un método de control de eventos de otro objeto o clase. No es que esto tenga mucho uso.

Cuestiones relacionadas