Eventos en C#

Ahora que hemos visto que son los delegados, vamos a pasar a qué son los eventos ya que están completamente relacionados. ya que con C# podemos utilizar event driven programming

Antes de continuar, decir que habré usado eventos en dos o tres proyectos y todos eran con aplicaciones de escritorio, así que eso indica que no son muy populares, pero hay que estar preparado y saber que es lo que estamos leyendo cuando programamos.

 

1 - Qué son los eventos

El concepto event en .NET es muy similar a lo que podría ser un evento en una empresa. Por ejemplo Google indica que va a haber un evento para enseñar el último producto. La empresa notificará a los usuarios a traves de un email que hay un nuevo producto.

En este escenario google es el editor, el cual crea un evento y los usuarios se convierten en suscriptores los cuales participaran en el evento.

Los eventos son acciones como pueden ser pulsar un botón, mover el ratón etcétera. Pero no solo tenemos los eventos que vienen predefinidos de lo que sería la interfaz, sino, que podemos crear eventos propios. 

Otra forma de describir los eventos es que un evento es un mensaje que es enviado por un objeto para indicar que cierta acción va a ocurrir. Como el  indicado anteriormente, hacer click con el ratón, o mover el mismo.

En C# los eventos, siguen el patrón editor-suscriptor

1.1 - El Editor

En C# lo que determinamos como editor (publisher) es el elemento que determina cuando un evento ha sido lanzado. Por lo tanto es el objeto que que contiene la definición de un evento y de su delegado, si no recuerdas lo que son los delegados, puedes consultarlo en el siguiente enlace.

La clase editora invocará el objeto del evento y lo notifica a los otros objetos. 

1.2 - El suscriptor

Es un objeto que acepta el evento y provee un event handler, que va a ser el método el cual va a ser ejecutado cuando ese evento ocurre. 

1.3 - El Evento

Finalmente disponemos del evento. El cual es la encapsulación de un delegado en la clase Editor.

 

2 - Declaración de un evento en C#

Ahora que tenemos la teoria mas o menos clara, vamos a pasar a la práctica. En términos generales un evento no es más que un delegado encapsulado.

Por ello lo primero que tenemos que hacer es declarar un delegado. Para cumplir un poco con la estructura de clases he creado una clase llamada Editor y en ella crearemos nuestro delegado.

public class Editor
{
    public delegate void EjemploEvento();
    public EjemploEvento ejemploEvento;
}

Para indicar que es un evento, únicamente debemos utilizar la palabra clave event antes de la declaración de la variable del tipo de delegado:

public class Editor
{
    public delegate void EjemploEvento();
    public event EjemploEvento ejemploEvento;
}

 

3 - Ejemplo event en C#

La forma más sencilla de entenderlo, será si utilizamos un ejemplo de como crear eventos en C#

Debemos indicar que para subscribirnos a un evento debemos utilizar “+=” y para darnos de baja “-=” ahora veremos cómo. 

3.1 - Creación del editor

Como ejemplo vamos a utilizar una lógica de lo que podría ser una calculadora, que como hemos visto anteriormente son ejemplos claros.

Para simplificar el uso, veremos simplemente sumar y restar.

public class EditorCalculadora
{
    public delegate void EjemploDelegado();
    public event EjemploDelegado ejemploEvento;

    public void sumar(int a, int b)
    {
        if (ejemploEvento != null)
        {
            ejemploEvento();
            Console.WriteLine("La suma es: {0}", a + b);
        }
        else
        {
            Console.WriteLine("No estas suscrito a los eventos");
        }
    }

    public void Restar(int a, int b)
    {
        if (ejemploEvento != null)
        {
            ejemploEvento();
            Console.WriteLine("La resta es: {0}", a - b);
        }
        else
        {
            Console.WriteLine("No estas suscrito a los eventos");
        }
    }
}

Como podemos observar disponemos de la clase EditorCalculadora la cual contiene un delegado y un event además de estos dos elementos, disponemos de dos métodos uno para sumar y otro para restar. 

Si miramos dentro de cualquiera de ellos, veremos que lo primero que hacemos es comprobar que el evento no es null, osea que existe, antes de ejecutarlo. 

3.2 - Creación del suscriptor

Para el suscriptor creamos una clase llamada SuscriptorCalculadoraVirtual la cual, va a suscribirse a los eventos. 

Primero debemos definir las variables y el constructor, así como los métodos que vamos a querer utilizar. 

Para suscribirnos a los eventos, debemos crear un método que encaje con el delegado de la clase Editor para ello crearemos un método que no reciba parámetros y devuelva void. Este método será ejecutado cada vez que el Editor lance un evento.

public class SuscriptorCalculadoraVirutal
{
    EditorCalculadora editor;
    private readonly int A;
    private readonly int B;

    public void EjemploEventHandler()
    {
        Console.WriteLine("Se va a imprimir el resultado:");
    }

    public SuscriptorCalculadoraVirutal(int a, int b)
    {
        editor = new EditorCalculadora();
        A = a;
        B = b;
    }

    public void ResultadoSuma()
    {
        editor.sumar(A, B);
    }

    public void ResultadoResta()
    {
        editor.Restar(A, B);
    }

}

Como vemos en el constructor definimos el constructor las variables y el Editor.

Ahora probamos a ejecutar el código:

SuscriptorCalculadoraVirutal calculadoraVirutal = new SuscriptorCalculadoraVirutal(3, 2);
calculadoraVirutal.ResultadoSuma();
calculadoraVirutal.ResultadoResta();

Como podemos observar nuestro código va a imprimir No estas suscrito a los eventos

Y esto es porque no nos hemos suscrito a los eventos. 

Para suscribirnos a un evento en C# debemos indicar la propiedad del objeto padre que es el evento y enlazarlo, utilizando += con el método que hemos creado en nuestra clase suscriptor que coincide con el delegado del editor. 

En nuestro ejemplo cambiamos el constructor de la clase suscriptora por lo siguiente:

public SuscriptorCalculadoraVirutal(int a, int b)
{
    editor = new EditorCalculadora();
    A = a;
    B = b;
    editor.ejemploEvento += EjemploEventHandler;
}

Y si ejecutamos el código vemos la siguiente respuesta:

Se va a imprimir el resultado:
La suma es: 5
Se va a imprimir el resultado:
La resta es: 1

Lo que nos permite ver como ahora Si estamos suscritos a los eventos. 

 

Conclusión

  • Utilizamos la palabra clave event junto con delegados para declarar eventos.
  • Debemos comprobar si un evento es nulo o no antes de ejecutarlo, ya que puede derivar en un error.
  • El editor determina cuando un evento es lanzado. el suscriptor determina qué acción o método ejecutar cuando ese evento sucede.
  • Para suscribirse a un evento debemos utilizar el operador +=. Para darse de baja hay que utilizar -=.
  • Para ejecutar un evento debemos invocar el delegado.
  • Podemos incluir eventos dentro de las interfaces
  • Los eventos son utilizados en su mayoría cuando tratamos con interfaces, para definir las acciones que van a ser ejecutadas al hacer click, etc. Son muy comunes fuera de .NET cuando hacemos paginas web.