Sobes.tech
Junior

¿Qué es un delegado en C#?

sobes.tech AI

Respuesta de la IA

Un delegado es un tipo de referencia, declarado con la palabra clave delegate. Encapsula un método con una firma específica (tipo de retorno y tipos de parámetros). En esencia, un delegado es un puntero seguro a métodos.

Propiedades principales de los delegados:

  • Encapsulación de métodos: El delegado almacena información sobre el método al que hace referencia.
  • Seguridad de tipos: El delegado solo puede referirse a métodos cuya firma coincide exactamente con la firma del delegado.
  • Multicast: Los delegados pueden referirse a varios métodos simultáneamente. Cuando se invoca un delegado, se llaman todos los métodos asociados en el orden en que fueron añadidos.

Ejemplo de declaración y uso:

// Declaración del delegado
public delegate int MyDelegate(int x, int y);

// Método que coincide con la firma del delegado
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Uso del delegado
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Creación de una instancia del delegado y vinculación con el método Add
        MyDelegate del = new MyDelegate(calc.Add);

        // Invocación del método a través del delegado
        int result = del(5, 3);
        System.Console.WriteLine(result); // Salida: 8
    }
}

Con la aparición de .NET Framework 3.5 y LINQ, los delegados genéricos integrados se han popularizado ampliamente:

  • Action<T1, ..., Tn>: Delegado que no devuelve valor (void). Puede aceptar de 0 a 16 parámetros de diferentes tipos.
  • Func<T1, ..., Tn, TResult>: Delegado que devuelve un valor de tipo TResult. Puede aceptar de 0 a 16 parámetros de diferentes tipos.
  • Predicate<T>: Delegado que acepta un parámetro de tipo T y devuelve un valor booleano. Se usa para verificar condiciones.

Tabla comparativa de los delegados integrados:

Delegado Valor de retorno Parámetros Ejemplo de uso
Action void 0..16 parámetros Realizar una acción sin devolver valor
Func<TResult> TResult 0 parámetros + valor de retorno TResult Cálculo sin datos de entrada
Func<T, TResult> TResult 1 parámetro de tipo T + valor de retorno TResult Transformación de valor
Predicate<T> bool 1 parámetro de tipo T Verificación de condición

Los delegados se usan ampliamente en el manejo de eventos, operaciones asíncronas, LINQ y para implementar callbacks.