Delegados (Guia de Programação em C#)

Um delegado é um tipo que representa referências aos métodos com lista de parâmetros e tipo de retorno específicos. Ao instanciar um delegado, você pode associar sua instância a qualquer método com assinatura e tipo de retorno compatíveis. Você pode invocar (ou chamar) o método através da instância de delegado.

Delegados são usados para passar métodos como argumentos a outros métodos. Os manipuladores de eventos nada mais são do que métodos chamados por meio de delegados. Ao criar um método personalizado, uma classe como um controle do Windows poderá chamá-lo quando um determinado evento ocorrer. O seguinte exemplo mostra uma declaração de delegado:

public delegate int PerformCalculation(int x, int y);

Qualquer método de qualquer classe ou struct acessível que corresponda ao tipo delegado pode ser atribuído ao delegado. O método pode ser estático ou de instância. Essa flexibilidade significa que você pode alterar programaticamente as chamadas de método ou conectar um novo código às classes existentes.

Observação

No contexto da sobrecarga de método, a assinatura de um método não inclui o valor retornado. No entanto, no contexto de delegados, a assinatura inclui o valor retornado. Em outras palavras, um método deve ter o mesmo tipo de retorno que o delegado.

Essa capacidade de se referir a um método como um parâmetro torna delegados ideais para definir métodos de retorno de chamada. Você pode escrever um método que compara dois objetos em seu aplicativo. Esse método pode ser usado em um delegado para um algoritmo de classificação. Como o código de comparação é separado da biblioteca, o método de classificação pode ser mais geral.

Ponteiros de função foram adicionados ao C# 9 para cenários semelhantes em que você precisa de mais controle sobre a convenção de chamada. O código associado a um delegado é invocado usando um método virtual adicionado a um tipo delegado. Usando ponteiros de função, você pode especificar convenções diferentes.

Visão geral de delegados

Os delegados possuem as seguintes propriedades:

  • Representantes são semelhantes a ponteiros de função do C++, mas delegados são totalmente orientados a objeto e, ao contrário dos ponteiros de C++ para funções de membro, os delegados encapsulam uma instância do objeto e um método.
  • Os delegados permitem que métodos sejam passados como parâmetros.
  • Os delegados podem ser usados para definir métodos de retorno de chamada.
  • Os delegados podem ser encadeados juntos; por exemplo, vários métodos podem ser chamados um único evento.
  • Os métodos não precisam corresponder exatamente ao tipo delegado. Para obter mais informações, confira Usando a variação delegados.
  • Expressões lambda são uma forma mais concisa de escrever blocos de código embutidos. As expressões lambda (em determinados contextos) são compiladas para tipos delegados. Para saber mais sobre expressões lambda, confira o artigo sobre expressões lambda.

Nesta seção

Especificação da Linguagem C#

Para obter mais informações, veja Delegados na Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Confira também