Operador delegado

O delegate operador cria um método anônimo que pode ser convertido em um tipo de delegado. Um método anônimo pode ser convertido em tipos como System.Action e System.Func<TResult> tipos usados como argumentos para muitos métodos.

Func<int, int, int> sum = delegate (int a, int b) { return a + b; };
Console.WriteLine(sum(3, 4));  // output: 7

Nota

As expressões lambda fornecem uma maneira 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 obter mais informações sobre recursos de expressões lambda, por exemplo, captura de variáveis externas, consulte Expressões lambda.

Ao usar o delegate operador, você pode omitir a lista de parâmetros. Se você fizer isso, o método anônimo criado pode ser convertido em um tipo de 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 é suportada por expressões lambda. Em todos os outros casos, uma expressão lambda é uma maneira preferida de escrever código embutido. Você pode usar descartáveis para especificar dois ou mais parâmetros de entrada de um método anônimo que não são 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 único parâmetro for nomeado _, _ será tratado como o nome desse parâmetro dentro de um método anônimo.

Você pode usar o static modificador 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 a partir do fechamento de escopos.

Você também usa a delegate palavra-chave para declarar um tipo de 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 seguinte método:

static void StaticFunction() { }

Quando você atribui o grupo de métodos a um delegado, o compilador armazenará 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, consulte a seção Expressões de função anônimas da especificação da linguagem C#.

Consulte também