Sobes.tech
Junior

O que é um delegado em C#?

sobes.tech IA

Resposta da IA

Um delegado é um tipo de referência declarado com a palavra-chave delegate. Encapsula um método com uma assinatura específica (tipo de retorno e tipos de parâmetros). Em essência, um delegado é um ponteiro seguro para métodos.

Propriedades principais dos delegados:

  • Encapsulamento de métodos: O delegado armazena informações sobre o método ao qual faz referência.
  • Segurança de tipos: O delegado só pode referenciar métodos cuja assinatura corresponda exatamente à assinatura do delegado.
  • Multicast: Os delegados podem referenciar vários métodos simultaneamente. Quando um delegado é invocado, todos os métodos associados são chamados na ordem em que foram adicionados.

Exemplo de declaração e uso:

// Declaração do delegado
public delegate int MyDelegate(int x, int y);

// Método que corresponde à assinatura do delegado
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

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

        // Criação de uma instância do delegado e vinculação ao método Add
        MyDelegate del = new MyDelegate(calc.Add);

        // Invocação do método através do delegado
        int result = del(5, 3);
        System.Console.WriteLine(result); // Saída: 8
    }
}

Com o surgimento do .NET Framework 3.5 e LINQ, os delegados genéricos embutidos tornaram-se amplamente utilizados:

  • Action<T1, ..., Tn>: Delegado que não retorna valor (void). Pode aceitar de 0 a 16 parâmetros de diferentes tipos.
  • Func<T1, ..., Tn, TResult>: Delegado que retorna um valor do tipo TResult. Pode aceitar de 0 a 16 parâmetros de diferentes tipos.
  • Predicate<T>: Delegado que aceita um parâmetro do tipo T e retorna um valor booleano. Usado para verificar condições.

Tabela comparativa dos delegados embutidos:

Delegado Valor de retorno Parâmetros Exemplo de uso
Action void 0..16 parâmetros Executar ação sem valor de retorno
Func<TResult> TResult 0 parâmetros + valor de retorno TResult Cálculo sem dados de entrada
Func<T, TResult> TResult 1 parâmetro do tipo T + valor de retorno TResult Transformação de valor
Predicate<T> bool 1 parâmetro do tipo T Verificação de condição

Delegados são amplamente utilizados no tratamento de eventos, operações assíncronas, LINQ e para implementação de callbacks.