operador delegate
O operador delegate
cria um método anônimo que pode ser convertido em um tipo delegado. Um método anônimo pode ser convertido em tipos como System.Action e System.Func<TResult> usados como argumentos em muitos métodos.
Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4)); // output: 7
Observação
As expressões lambda fornecem uma forma mais concisa e expressiva de criar uma função anônima. Use o => (operador) para construir uma expressão lambda:
Func<int, int, int> sum = (a, b) => a + b;
Console.WriteLine(sum(3, 4)); // output: 7
Para saber mais sobre recursos de expressões lambda, por exemplo, que capturam variáveis externas, confira Expressões lambda.
Você pode omitir a lista de parâmetros quando usa o operador delegate
. Se você fizer isso, o método anônimo criado poderá ser convertido em um tipo delegado com qualquer lista de parâmetros, como mostra o exemplo a seguir:
Action greet = delegate { Console.WriteLine("Hello!"); };
greet();
Action<int, double> introduce = delegate { Console.WriteLine("This is world!"); };
introduce(42, 2.7);
// Output:
// Hello!
// This is world!
Essa é a única funcionalidade de métodos anônimos que não tem suporte por expressões lambda. Em todos os outros casos, uma expressão lambda é a forma preferida de gravar código embutido. Use discards para especificar dois ou mais parâmetros de entrada de um método anônimo que não sejam usados pelo método:
Func<int, int, int> constant = delegate (int _, int _) { return 42; };
Console.WriteLine(constant(3, 4)); // output: 42
Para compatibilidade com versões anteriores, se apenas um parâmetro for nomeado _
, _
será tratado como o nome desse parâmetro em um método anônimo.
Use o modificador static
na declaração de um método anônimo:
Func<int, int, int> sum = static delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(10, 4)); // output: 14
Um método anônimo estático não pode capturar variáveis locais ou o estado da instância entre escopos.
Você também usa a palavra-chave delegate
para declarar um tipo delegado.
A partir do C# 11, o compilador pode armazenar em cache o objeto delegado criado a partir de um grupo de métodos. Considere o método a seguir:
static void StaticFunction() { }
Quando você atribui o grupo de métodos a um delegado, o compilador armazena em cache o delegado:
Action a = StaticFunction;
Antes do C# 11, você precisaria usar uma expressão lambda para reutilizar um único objeto delegado:
Action a = () => StaticFunction();
Especificação da linguagem C#
Para obter mais informações, confira a seção Expressões de função anônima da Especificação da linguagem C#.
Confira também
- Operadores e expressões C#
- operador =>