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:
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
-
Declaración de un Delegado:
public delegate void MiDelegado(string mensaje);
-
Creación de una Instancia del Delegado:
MiDelegado delegado = new MiDelegado(MiMetodo);
-
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
-
Definición del Delegado:
public delegate void MiDelegado(string mensaje);
- Define un delegado llamado
MiDelegado
que puede apuntar a cualquier método que acepte unstring
y devuelvavoid
.
- Define un delegado llamado
-
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
.
- Este método coincide con la firma del delegado
-
Creación de una Instancia del Delegado:
MiDelegado delegado = new MiDelegado(MiMetodo);
- Crea una instancia del delegado y lo asigna al método
MiMetodo
.
- Crea una instancia del delegado y lo asigna al método
-
Invocación del Delegado:
delegado("Hola, Mundo!");
- Invoca el delegado, que a su vez llama al método
MiMetodo
con el argumento"Hola, Mundo!"
.
- Invoca el delegado, que a su vez llama al método
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:
Uso de Eventos
-
Declaración del Delegado y el Evento:
public delegate void MiDelegado(string mensaje); public event MiDelegado MiEvento;
-
Suscripción al Evento:
MiEvento += MiMetodo;
-
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
-
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.
-
Método para Invocar el Evento:
public void DispararEvento(string mensaje)
- Este método invoca el evento
MiEvento
si hay suscriptores.
- Este método invoca el evento
-
Suscripción al Evento:
publicador.MiEvento += suscriptor.MiMetodo;
- El método
MiMetodo
delSuscriptor
se suscribe al eventoMiEvento
.
- El método
-
Disparar el Evento:
publicador.DispararEvento("Hola, Mundo!");
- Invoca el método
DispararEvento
, que a su vez invoca el eventoMiEvento
, llamando al métodoMiMetodo
delSuscriptor
.
- Invoca el método
Ejercicios Prácticos
Ejercicio 1: Delegados Básicos
Instrucciones:
- Define un delegado que acepte dos enteros y devuelva un entero.
- Crea un método que sume dos enteros y otro que los multiplique.
- 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:
- Define un evento que se dispare cuando se complete una tarea.
- Crea una clase
Tarea
que tenga un método para completar la tarea y dispare el evento. - 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.
Curso de Programación en C#
Módulo 1: Introducción a C#
- Introducción a C#
- Configuración del Entorno de Desarrollo
- Programa Hola Mundo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
Módulo 2: Estructuras de Control
Módulo 3: Programación Orientada a Objetos
- Clases y Objetos
- Métodos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulamiento
- Abstracción
Módulo 4: Conceptos Avanzados de C#
- Interfaces
- Delegados y Eventos
- Genéricos
- Colecciones
- LINQ (Consulta Integrada en el Lenguaje)
- Programación Asíncrona
Módulo 5: Trabajando con Datos
Módulo 6: Temas Avanzados
- Reflexión
- Atributos
- Programación Dinámica
- Gestión de Memoria y Recolección de Basura
- Multihilo y Programación Paralela
Módulo 7: Construcción de Aplicaciones
Módulo 8: Mejores Prácticas y Patrones de Diseño
- Estándares de Codificación y Mejores Prácticas
- Patrones de Diseño
- Pruebas Unitarias
- Revisión y Refactorización de Código