Sobes.tech
Junior

O que são delegados em C# e para que são utilizados?

sobes.tech IA

Resposta da IA

Os delegados em C# são ponteiros seguros de tipo para métodos. Eles encapsulam um método, permitindo passá-lo como parâmetro ou usá-lo como tipo de variável.

São utilizados para:

  • Implementação do padrão observador (Observer): Os eventos em C# baseiam-se em delegados. O emissor notifica os assinantes chamando o delegado.
  • CallBacks (Retornos de chamada): Passar um método como argumento para uma função que o chamará mais tarde.
  • Programação genérica: Os delegados Action e Func permitem criar métodos genéricos que funcionam com diferentes assinaturas de tipos.
  • Programação paralela e assíncrona: Métodos para execução em outros threads ou de forma assíncrona são frequentemente passados por delegados.
  • LİNQ: Os operadores LINQ usam ativamente delegados para definir condições de filtragem, transformação, etc.

Exemplo de declaração e uso de um delegado:

// Declaração de um delegado com assinatura void e um argumento do 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)
    {
        // Criação de uma instância do delegado apontando para o método PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Chamada do método através do delegado
        del(10);
    }
}

Exemplo com Action (para métodos void sem valor de retorno):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Executa o delegado passado
    }

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

Exemplo com Func (para métodos com valor de retorno):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Executa a operação passada e retorna o 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 da soma: {result}");
    }
}