Sobes.tech
Junior

¿Qué son los delegados en C# y para qué se utilizan?

sobes.tech AI

Respuesta de la IA

Los delegados en C# son punteros seguros en cuanto a tipos a métodos. Encapsulan un método, permitiendo pasarlo como parámetro o usarlo como tipo de variable.

Se utilizan para:

  • Implementación del patrón observador (Observer): Los eventos en C# se basan en delegados. El emisor notifica a los suscriptores llamando al delegado.
  • Llamadas de retorno (Callbacks): Pasar un método como argumento a una función que lo llamará más tarde.
  • Programación genérica: Los delegados Action y Func permiten crear métodos genéricos que trabajan con diferentes tipos de firmas.
  • Programación paralela y asíncrona: Los métodos para ejecutar en otros hilos o de forma asíncrona a menudo se pasan mediante delegados.
  • LİNQ: Los operadores LINQ utilizan activamente delegados para definir condiciones de filtrado, transformación, etc.

Ejemplo de declaración y uso de un delegado:

// Declaración de un delegado con firma void y un argumento de tipo int
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Número: {num}");
    }

    public static void Main(string[] args)
    {
        // Crear una instancia del delegado que apunta al método PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Llamar al método a través del delegado
        del(10);
    }
}

Ejemplo con Action (para métodos void sin valor de retorno):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Ejecutar el delegado pasado
    }

    public static void Main(string[] args)
    {
        Action myAction = () => Console.WriteLine("¡Hola desde Action!");
        new OtherClass().ExecuteAction(myAction);
    }
}

Ejemplo con Func (para métodos con valor de retorno):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Ejecutar la operación pasada y devolver el resultado
    }

    public static void Main(string[] args)
    {
        Func<int, int, int> add = (x, y) => x + y;
        int result = new ThirdClass().Calculate(add, 5, 3);
        Console.WriteLine($"Resultado de la suma: {result}");
    }
}