Delegados (C# Guia de Programação)

Um delegado é um tipo que representa referências a métodos com uma lista de parâmetros particulares e tipo de devolução. Ao instantanear um delegado, pode associar a sua instância a qualquer método com um tipo de assinatura e devolução compatíveis. Pode invocar (ou chamar) o método através da instância dedelegado.

Os delegados são usados para passar métodos como argumentos para outros métodos. Os manipuladores de eventos não passam de métodos que são invocados através de delegados. Cria-se um método personalizado, e uma classe como um controlo de janelas pode chamar o seu método quando ocorre um determinado evento. O exemplo a seguir mostra uma declaração de delegado:

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

Qualquer método de qualquer classe ou estrutura acessível que corresponda ao tipo de delegado pode ser atribuído ao delegado. O método pode ser estático ou um método de instância. Esta flexibilidade significa que pode alterar programáticamente chamadas de métodos ou ligar novo código às classes existentes.

Nota

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

Esta capacidade de se referir a um método como parâmetro torna os delegados ideais para definir métodos de retorno. Pode escrever um método que compara dois objetos na sua aplicação. Este método pode ser usado num delegado para um algoritmo de tipo. Como o código de comparação é separado da biblioteca, o método de tipo pode ser mais geral.

Foram adicionados ponteiros de função ao C# 9 para cenários semelhantes, onde é necessário mais controlo sobre a convenção de chamadas. O código associado a um delegado é invocado usando um método virtual adicionado a um tipo de delegado. Utilizando ponteiros de função, pode especificar diferentes convenções.

Visão geral dos delegados

Os delegados têm as seguintes propriedades:

  • Os delegados são semelhantes aos ponteiros de função C++, mas os delegados são totalmente orientados para o objeto, e ao contrário dos ponteiros C++ para as funções dos membros, os delegados encapsulam tanto uma instância de objeto como um método.
  • Os delegados permitem que os métodos sejam aprovados como parâmetros.
  • Os delegados podem ser usados para definir métodos de retorno.
  • Os delegados podem ser acorrentados em conjunto; por exemplo, vários métodos podem ser chamados num único evento.
  • Os métodos não têm de corresponder exatamente ao tipo delegado. Para obter mais informações, consulte Usando Variação em Delegados.
  • As expressões lambda são uma forma mais concisa de escrever blocos de código inline. As expressões lambda (em certos contextos) são compiladas para os tipos de delegados. Para mais informações sobre expressões lambda, consulte as expressões lambda.

Nesta secção

Especificação linguística C#

Para mais informações, consulte os delegados na Especificação de Idioma C. A especificação linguística é a fonte definitiva para a sintaxe e utilização C#.

Ver também