Delegates, Events y Lambdas
Los delegates en C# son como variables que guardan funciones. En JavaScript puedes hacer const fn = () => algo, en C# usas delegate o los tipos predefinidos Func y Action. Func<int, int, int> es una función que recibe dos ints y retorna int. Action<string> es una función que recibe un string y no retorna nada.
Esto permite pasar comportamiento como parámetro: el método Sort recibe un Func que define el criterio de comparación.
Los eventos (event) son el sistema de notificaciones de C# basado en delegates. Un objeto expone un event, y otros objetos se suscriben con +=. Cuando el objeto dispara el evento con Invoke(), todos los suscriptores son notificados automáticamente.
Este es el patrón Observer aplicado al lenguaje mismo, y es la base de toda la interfaz de usuario en WPF, WinForms, Unity, y ASP.NET Core. Los multicast delegates permiten que un evento tenga múltiples suscriptores encadenados.
// Delegate - tipo que referencia un método
public delegate int Operacion(int a, int b);
int Sumar(int a, int b) => a + b;
int Multiplicar(int a, int b) => a * b;
Operacion op = Sumar;
Console.WriteLine(op(3, 4)); // 7
op = Multiplicar;
Console.WriteLine(op(3, 4)); // 12
// Func<T> y Action<T> - delegates predefinidos
Func<int, int, int> suma = (a, b) => a + b;
Func<string, bool> esLargo = s => s.Length > 10;
Action<string> imprimir = msg => Console.WriteLine(msg);
Action procesar = () => Console.WriteLine("Procesando...");
Console.WriteLine(suma(5, 3)); // 8
Console.WriteLine(esLargo("Hola")); // false
imprimir("Mensaje");
// Predicates y Comparers
Predicate<int> esPar = n => n % 2 == 0;
Console.WriteLine(esPar(4)); // true
// Multicast delegate
Action saludar = () => Console.WriteLine("Hola");
saludar += () => Console.WriteLine("Hi");
saludar += () => Console.WriteLine("Bonjour");
saludar(); // Imprime los tres saludos
// Events
public class Temporizador {
public event Action? Tick; // Event
public void Iniciar() {
for (int i = 0; i < 3; i++) {
System.Threading.Thread.Sleep(1000);
Tick?.Invoke(); // Dispara el evento
}
}
}
var timer = new Temporizador();
timer.Tick += () => Console.WriteLine("¡Tick!");
timer.Iniciar();
Practica esta lección
Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.
Empezar a practicar