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 tipoTResult. Pode aceitar de 0 a 16 parâmetros de diferentes tipos.Predicate<T>: Delegado que aceita um parâmetro do tipoTe 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.