No entiendo por qué necesitamos la palabra clave "evento" al definir eventos, cuando podemos hacer lo mismo sin usar la palabra clave "evento", simplemente usando los delegados.
p.ej
public delegate void CustomEventHandler(int a, string b);
public event CustomEventHandler customEvent;
customEvent += new CustomEventHandler(customEventHandler);
customEvent(1,"a"); // Raising the event
Aquí, si elimino la palabra clave "evento" de la segunda línea, también puedo generar el evento invocando al delegado. ¿Alguien puede decirme por qué se necesita esta palabra clave de evento?
Respuestas:
Los eventos similares a campos y los campos públicos de los tipos de delegados se ven similares, pero en realidad son muy diferentes.
Un evento es fundamentalmente como una propiedad: es un par de métodos de agregar / quitar (en lugar del get / set de una propiedad). Cuando declaras un evento similar a un campo (es decir, uno en el que no especificas agregar / eliminar bits tú mismo), se crea un evento público y un campo de respaldo privado. Esto le permite plantear el evento de forma privada, pero permite la suscripción pública. Con un campo de delegado público, cualquiera puede eliminar los controladores de eventos de otras personas, generar el evento ellos mismos, etc. Es un desastre de encapsulación.
Para más información sobre eventos (y delegados) lea mi artículo sobre este tema . (En algún momento, necesito actualizar esto para C # 4, que cambia ligeramente los eventos tipo campo. Sin embargo, la esencia sigue siendo correcta).
fuente
La palabra clave de evento hace 3 cosas diferentes:
=
y()
(asignación e invocación) a privado, de modo que solo la clase que lo contiene pueda invocar el evento o anular todos los métodos que contiene. Los operadores-=
y+=
aún se pueden invocar en un evento desde fuera de la clase que lo define (obtienen el modificador de acceso que escribió junto al evento).-=
y el+=
comportamiento de los eventos.fuente
Las otras respuestas están bien; Solo me gustaría agregar algo más en lo que pensar.
Su pregunta es "¿por qué necesitamos eventos cuando tenemos campos de tipo delegado?" Ampliaría esa pregunta: ¿por qué necesita métodos, propiedades, eventos, constructores de instancias o finalizadores si tiene campos de tipo delegado? ¿Por qué necesita algo más que campos que contienen valores y delegados en un tipo? Por qué no decir
?
No necesitas métodos, propiedades o eventos. Le brindamos todo eso porque el método, la propiedad y los patrones de diseño de eventos son importantes y útiles, y merecen tener una forma estándar, documentada y clara de implementarlos en el lenguaje.
fuente
Es en parte necesario porque si omite la
event
palabra clave, se rompe la encapsulación. Si es solo un delegado de multidifusión público, cualquiera puede invocarlo, configurarlo como nulo o alterarlo. SiMailNotifier
existe una clase llamada y tiene un evento llamadoMailReceived
, no tiene sentido que otros tipos puedan disparar ese evento mediante una llamadamailNotifier.MailReceived()
;Por otro lado, solo puede entrometerse e invocar eventos de 'campo como' del tipo que lo definió.
Si desea mantener privada la invocación de su evento, no hay nada que le impida hacer algo como esto:
... pero eso es una gran cantidad de código solo para (más o menos) hacer lo que los eventos de campo ya nos brindan.
fuente
Los eventos tienen distintas ventajas en comparación con los campos delegados. Los eventos se pueden definir en interfaces en contraste con los campos, agregando abstracción al código y, lo que es aún más importante: los eventos solo se pueden llamar desde dentro de la clase de definición. En su caso, cualquiera podría llamar al evento, posiblemente destruyendo su código.
Consulte esta publicación de blog para obtener más información.
fuente
delegado es un tipo de referencia. Hereda MulticastDelegate . evento es un modificador. eventoes un modificador especial para delegado. Modifica la accesibilidad de alguna función / método, por ejemplo, Invocar método. Una vez modificada por evento modificador, una instancia de delegado se convierte en un nuevo concepto "Evento". Entonces, Event es solo un delegado modificado. No puede cambiar la referencia directamente o invocar un Evento fuera de la clase donde se definió el Evento, pero puede cambiar la referencia o invocar una instancia de delegado normal. Event proporciona protección adicional, de modo que Event tiene más funciones de seguridad. Cuando está fuera de la clase donde se definió el evento, se le permite realizar dos tipos de operaciones en el evento, "+ =" y "- =". Pero puede acceder a todos los campos públicos, propiedades, métodos, etc. de una instancia de delegado normal. He aquí un ejemplo:
fuente