Introducción

En este módulo, aprenderemos sobre dos conceptos fundamentales en C#: Delegados y Eventos. Estos conceptos son esenciales para entender cómo manejar y responder a acciones y eventos en aplicaciones C#.

Objetivos del Módulo

  • Comprender qué son los delegados y cómo se utilizan.
  • Aprender a definir y utilizar eventos.
  • Implementar ejemplos prácticos que demuestren el uso de delegados y eventos.

Delegados

¿Qué es un Delegado?

Un delegado es un tipo que representa referencias a métodos con una lista de parámetros y un tipo de retorno particular. Los delegados son similares a los punteros a funciones en C++, pero son más seguros y orientados a objetos.

Definición de un Delegado

Para definir un delegado, utilizamos la palabra clave delegate. Aquí hay un ejemplo básico:

public delegate void MiDelegado(string mensaje);

En este ejemplo, MiDelegado es un delegado que puede apuntar a cualquier método que tenga un parámetro string y no devuelva ningún valor (void).

Uso de Delegados

  1. Declaración de un Delegado:

    public delegate void MiDelegado(string mensaje);
    
  2. Creación de una Instancia del Delegado:

    MiDelegado delegado = new MiDelegado(MiMetodo);
    
  3. Invocación del Delegado:

    delegado("Hola, Mundo!");
    

Ejemplo Práctico

using System;

public class Program
{
    // Definición del delegado
    public delegate void MiDelegado(string mensaje);

    // Método que coincide con la firma del delegado
    public static void MiMetodo(string mensaje)
    {
        Console.WriteLine(mensaje);
    }

    public static void Main()
    {
        // Creación de una instancia del delegado
        MiDelegado delegado = new MiDelegado(MiMetodo);

        // Invocación del delegado
        delegado("Hola, Mundo!");
    }
}

Explicación del Código

  1. Definición del Delegado: public delegate void MiDelegado(string mensaje);

    • Define un delegado llamado MiDelegado que puede apuntar a cualquier método que acepte un string y devuelva void.
  2. Método que Coincide con la Firma del Delegado: public static void MiMetodo(string mensaje)

    • Este método coincide con la firma del delegado MiDelegado.
  3. Creación de una Instancia del Delegado: MiDelegado delegado = new MiDelegado(MiMetodo);

    • Crea una instancia del delegado y lo asigna al método MiMetodo.
  4. Invocación del Delegado: delegado("Hola, Mundo!");

    • Invoca el delegado, que a su vez llama al método MiMetodo con el argumento "Hola, Mundo!".

Eventos

¿Qué es un Evento?

Un evento es un mecanismo que permite a una clase o un objeto notificar a otros objetos cuando ocurre algo. Los eventos se basan en delegados y son una forma de implementar el patrón de diseño Observer.

Definición de un Evento

Para definir un evento, utilizamos la palabra clave event junto con un delegado. Aquí hay un ejemplo básico:

public delegate void MiDelegado(string mensaje);
public event MiDelegado MiEvento;

Uso de Eventos

  1. Declaración del Delegado y el Evento:

    public delegate void MiDelegado(string mensaje);
    public event MiDelegado MiEvento;
    
  2. Suscripción al Evento:

    MiEvento += MiMetodo;
    
  3. Invocación del Evento:

    MiEvento("Hola, Mundo!");
    

Ejemplo Práctico

using System;

public class Publicador
{
    // Definición del delegado
    public delegate void MiDelegado(string mensaje);

    // Definición del evento
    public event MiDelegado MiEvento;

    // Método para invocar el evento
    public void DispararEvento(string mensaje)
    {
        if (MiEvento != null)
        {
            MiEvento(mensaje);
        }
    }
}

public class Suscriptor
{
    // Método que coincide con la firma del delegado
    public void MiMetodo(string mensaje)
    {
        Console.WriteLine("Evento recibido: " + mensaje);
    }
}

public class Program
{
    public static void Main()
    {
        // Creación de instancias del publicador y el suscriptor
        Publicador publicador = new Publicador();
        Suscriptor suscriptor = new Suscriptor();

        // Suscripción al evento
        publicador.MiEvento += suscriptor.MiMetodo;

        // Disparar el evento
        publicador.DispararEvento("Hola, Mundo!");
    }
}

Explicación del Código

  1. Definición del Delegado y el Evento:

    • public delegate void MiDelegado(string mensaje);
    • public event MiDelegado MiEvento;
    • Define un delegado y un evento basado en ese delegado.
  2. Método para Invocar el Evento: public void DispararEvento(string mensaje)

    • Este método invoca el evento MiEvento si hay suscriptores.
  3. Suscripción al Evento: publicador.MiEvento += suscriptor.MiMetodo;

    • El método MiMetodo del Suscriptor se suscribe al evento MiEvento.
  4. Disparar el Evento: publicador.DispararEvento("Hola, Mundo!");

    • Invoca el método DispararEvento, que a su vez invoca el evento MiEvento, llamando al método MiMetodo del Suscriptor.

Ejercicios Prácticos

Ejercicio 1: Delegados Básicos

Instrucciones:

  1. Define un delegado que acepte dos enteros y devuelva un entero.
  2. Crea un método que sume dos enteros y otro que los multiplique.
  3. Usa el delegado para invocar ambos métodos.

Solución:

using System;

public class Program
{
    // Definición del delegado
    public delegate int Operacion(int a, int b);

    // Método que suma dos enteros
    public static int Sumar(int a, int b)
    {
        return a + b;
    }

    // Método que multiplica dos enteros
    public static int Multiplicar(int a, int b)
    {
        return a * b;
    }

    public static void Main()
    {
        // Creación de instancias del delegado
        Operacion operacionSumar = new Operacion(Sumar);
        Operacion operacionMultiplicar = new Operacion(Multiplicar);

        // Invocación de los delegados
        Console.WriteLine("Suma: " + operacionSumar(3, 4));
        Console.WriteLine("Multiplicación: " + operacionMultiplicar(3, 4));
    }
}

Ejercicio 2: Eventos Básicos

Instrucciones:

  1. Define un evento que se dispare cuando se complete una tarea.
  2. Crea una clase Tarea que tenga un método para completar la tarea y dispare el evento.
  3. Crea una clase Notificador que se suscriba al evento y muestre un mensaje cuando se complete la tarea.

Solución:

using System;

public class Tarea
{
    // Definición del delegado
    public delegate void TareaCompletadaHandler(string mensaje);

    // Definición del evento
    public event TareaCompletadaHandler TareaCompletada;

    // Método para completar la tarea
    public void CompletarTarea()
    {
        Console.WriteLine("Tarea completada.");
        OnTareaCompletada("La tarea ha sido completada.");
    }

    // Método para invocar el evento
    protected virtual void OnTareaCompletada(string mensaje)
    {
        if (TareaCompletada != null)
        {
            TareaCompletada(mensaje);
        }
    }
}

public class Notificador
{
    // Método que coincide con la firma del delegado
    public void Notificar(string mensaje)
    {
        Console.WriteLine("Notificación: " + mensaje);
    }
}

public class Program
{
    public static void Main()
    {
        // Creación de instancias de Tarea y Notificador
        Tarea tarea = new Tarea();
        Notificador notificador = new Notificador();

        // Suscripción al evento
        tarea.TareaCompletada += notificador.Notificar;

        // Completar la tarea
        tarea.CompletarTarea();
    }
}

Conclusión

En este módulo, hemos aprendido sobre delegados y eventos en C#. Los delegados nos permiten encapsular métodos y los eventos nos permiten notificar a otros objetos cuando ocurre algo. Estos conceptos son fundamentales para la programación orientada a eventos y son ampliamente utilizados en aplicaciones C#.

Resumen

  • Delegados: Representan referencias a métodos y permiten invocar métodos de manera flexible.
  • Eventos: Permiten a una clase notificar a otras clases cuando ocurre algo, utilizando delegados.

Con estos conocimientos, estás preparado para manejar eventos y delegados en tus aplicaciones C#. En el próximo módulo, exploraremos los genéricos, que te permitirán escribir código más flexible y reutilizable.

© Copyright 2024. Todos los derechos reservados