Como crear y llamar a un evento en C Sharp

Los eventos nos resultan muy útiles al momento de querer hacer nuestras clases independientes de otras, ya que nos permiten enviar y solicitar información en tiempo de ejecución. En el siguiente ejemplo trataremos de explicar de la manera mas simple posible la creación y uso de eventos.

Para este ejemplo utilizaremos la clase Cliente y un formulario llamado FrmCliente el cual recibirá un mensaje enviado desde la clase Cliente a través de un evento. Recordemos que este es un ejemplo básico para entender de manera simple el manejo de eventos.

Creando un evento con nuestro propio delegado

Lo primero y muy importante es declarar un delegado(son utilizados para definir los parámetros que recibirá y enviara el evento).

Declaración del Delegado

 
namespace Eventos
{
    public delegate void delegateLogMessage(string mensaje);
    
    public class Cliente
    {... }
} 
 

El delegado debe ubicarse en el namespace para ser utilizado por todas las clases que lo requieran, esto quiere decir que si creamos una Clase Proveedor dentro del mismo namespace no seria necesario declararlo para poder utilizarlo.
La estructura que utiliza es:

  • Visibilidad (public ya que necesitamos que sea visible desde otras clases)
  • La palabra delegate (para indicar que es un delegado)
  • El tipo de datos que espera recibir el evento (utilizaremos void ya que no quiero recibir nada)
  • Un nombre cualquiera aunque les recomiendo agregar la palabra delegate antes del nombre
  • Atributos que enviara el evento hacia afuera
  • Declaración del evento

     ...
       public class Cliente
        {
            public event delegateLogMessage eventMensaje;
        } 
    

    El evento debe ser declarado como parte de la clase fuera de sus métodos

    La estructura del evento es:

  • Visibilidad (public ya que necesitamos que sea visible desde otras clases)
  • La palabra event para indicar que es un evento
  • El delegado que utilizara en este caso el que creamos anteriormente delegateLogMessage
  • Nombre del evento, les recomiendo utilizar la palabra event seguido del nombre para reconocerlo posteriormente.
  • Con estos pasos ya estamos en condiciones de poder enviar nuestro evento hacia fuera de la clase, para realizar esto solo hace falta que en la clase donde creamos el evento se haga referencia a este, veamos el siguiente ejemplo:

    namespace Eventos
    {
        public delegate void delegateLogMessage(string mensaje);
    
        public class Cliente
        {
            public event delegateLogMessage eventMensaje;
    
            public Cliente()
            {
    
            }
            public void PruebaMetodo() {
    
                eventMensaje("Esto es una prueba");
                //Como podemos observar nuestro evento utiliza el delegado delegateLogMessage
                // y la estructura de este indica que no devuelve nada
                // y que necesita que envien un string tal como se muestra aqui
            
            }
        }
    }
    

    En este ejemplo creamos el método PruebaMetodo que solo hace una llamada al evento recién creado.

    Hasta aquí ya tenemos nuestro evento creado y listo para ser utilizado por cualquier clase que utilice la clase Cliente.

    Utilizando Evento

    
    using System.Windows.Forms;
    
    namespace Eventos
    {
        public partial class FormCliente : Form
        {
            public FormCliente()
            {
                InitializeComponent();
                Cliente cliente = new Cliente();
                cliente.eventMensaje += new delegateLogMessage(OnClienteEventMensaje);
                //La llamada al evento siempre debe hacerse luego de la instanciación del objeto
                cliente.PruebaMetodo();
                //El evento solo ocurrirá si se utiliza el método PruebaMetodo()
            }
            //Método con la misma estructura del delegado que utiliza el evento  
            protected void OnClienteEventMensaje(string mensaje)
            {
               MessageBox.Show(mensaje);
              //Imprimimos el valor que obtiene desde la otra clase           
            }
        }
    }
    

    Como podemos observar la manera de llamar a un evento es:

    cliente. = nombre objeto instanciado.
    eventMensaje = nombre evento.
    += =Este símbolo permite concatenar el objeto que se encuentra antes con el posterior.
    Se utiliza para llamadas a eventos principalmente.
    new delegateLogMessage = se crea una llamada al delegado que utiliza el evento.
    (OnClienteEventMensaje) = método dentro de la clase con la estructura esperada por el evento (estructura delegado).

    Es muy importante evitar repetir una llamada a un evento ya que por cada llamada se repetirá la acción del evento. (repetir la llamada en este ejemplo significaría ver multiples messageBox )
    Si el objeto será utilizado por todo el formulario, se recomienda llamarlo en el constructor de este UNA sola vez.
    Recordemos que los eventos ocurren en el momento que nosotros lo definimos dentro de la clase contenedora, si nosotros no llamamos al método que contiene el retorno del evento nunca lo veremos. Pueden hacer la prueba eliminando la línea cliente.PruebaMetodo(); verán como no ocurre nada en particular (el messageBox no se ejecutara).

    Saludos espero les sea de utilidad.

    También te podría gustar...

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada.