Inicio > Cursos > C# > Delegates, Events y Lambdas
C#C# ModernoLección 16 de 20

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();
Consejo✨ Func<T,R> es para funciones que retornan valor. Action<T> es para funciones que no retornan nada (void). Son los delegates más usados.
← Records, Structs y GenericsAsync/Await y Tasks →

Practica esta lección

Resuelve los ejercicios del curso de C# en la app, gratis y con corrección automática.

Empezar a practicar