visual studio puede manejo eventos evento delegados crear controlador agregar c# delegates event-handling encapsulation

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,

  1. Impide que otras clases le asignen algo
  2. Impide pasarlo como un parámetro a los métodos
  3. Impide asignarlo a cualquier variable
  4. Impide llamarlo desde otras clases (ni siquiera las clases derivadas tienen acceso a él)
  5. 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.