c# - studio - ¿Por qué el evento público no puede invocarse fuera directamente?
manejo de eventos en c# (6)
Considere que tenemos una clase con evento declarado:
public class FooBar
{
public event EventHandler FooBarEvent;
}
A pesar de la "publicidad" del evento, no podemos llamar a FooBarEvent.Invoke
desde el exterior.
Esto se supera modificando una clase con el siguiente enfoque:
public class FooBar
{
public event EventHandler FooBarEvent;
public void RaiseFooBarEvent(object sender, EventArgs eventArguments)
{
FooBarEvent.Invoke(sender, eventArguments);
}
}
¿Por qué acceder a eventos públicos externos está limitado al agregar y eliminar solo oyentes?
Creo que deberías cambiar tu perspectiva sobre cómo funcionan los eventos. Otras clases no deben "poseer" el evento y desencadenarlo. Clases que "escuchan" el evento "suscribiéndose" al mismo y realizan una determinada acción cuando ocurre este evento.
Esa es la forma en que se define el idioma: un evento solo puede ser activado por la clase propietaria. Si debe iniciarlo desde una clase diferente, haga que la clase propietaria defina un método público que activará el evento:
public FireFooBarEvent (object sender, EventArgs args)
{
if(FooBarEvent != null)
FooBarEvent(sender, args);
}
Y llama a este método desde cualquier clase.
La definición de un evento public
simplemente ofrece a los consumidores la posibilidad de suscribirse y darse de baja. La capacidad de generar el evento se limita a la jerarquía de tipos que declara el evento.
Permitir que todos los suscriptores también puedan plantear el evento sería un poco caótico. Imagine, por ejemplo, que tenía una clase TextBox
que tenía un evento Focused
. Si algún viejo consumidor pudiera plantear el evento, el evento Focused
podría dispararse fácilmente cuando la clase TextBox
no estuviera realmente enfocada. Esto haría casi imposible mantener cualquier tipo de invariante durante un evento.
Para eso son los eventos. Si desea invocarlo públicamente, probablemente necesite delegates
no events
Eventos da encapsulación,
- Impide que otras clases le asignen algo
- Impide pasarlo como un parámetro a los métodos
- Impide asignarlo a cualquier variable
- Impide llamarlo desde otras clases (ni siquiera las clases derivadas tienen acceso a él)
- etc
public
accesibilidad public
dice que se puede suscribir desde cualquier lugar, no invocarse desde ningún lugar.
Personalmente, creo que esto se hace para transmitir adecuadamente los principios de diseño detrás de toda la arquitectura de eventos.
El propósito de un evento es notificar a un oyente de dicho evento que ocurre en un objeto dado.
¿De qué sirve levantar eventos de clases que no te pertenecen?
la respuesta a tu pregunta es
Un evento en C # es una forma para que una clase proporcione notificaciones a los clientes de esa clase cuando le sucede algo interesante a un objeto.
Invocar el evento desde afuera no tiene sentido, por lo tanto, no está permitido.