Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Os delegados fornecem um mecanismo de associação tardia no .NET. Ligação tardia (late binding) significa que você cria um algoritmo em que o chamador também fornece pelo menos um método que implementa parte do algoritmo.
Por exemplo, considere classificar uma lista de estrelas em um aplicativo de astronomia. Você pode optar por classificar essas estrelas por sua distância da Terra, ou pela magnitude da estrela, ou seu brilho percebido.
Em todos esses casos, o método Sort() faz essencialmente a mesma coisa: organiza os itens na lista com base em alguma comparação. O código que compara duas estrelas é diferente para cada uma das ordenações de classificação.
Esses tipos de soluções são usados em software há meio século. O conceito de delegado de linguagem C# fornece suporte de linguagem de primeira classe e segurança de tipos em torno do conceito.
Como você verá mais adiante nesta série, o código C# que você escreve para algoritmos como esse é tipo seguro. O compilador garante que os tipos correspondam a argumentos e tipos de retorno.
Os ponteiros de função dão suporte a 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 de delegado. Usando ponteiros de função, você pode especificar convenções diferentes.
Metas de design de idioma para delegados
Os designers de linguagem enumeraram várias metas para o recurso que eventualmente se tornaram delegados.
A equipe queria um constructo de linguagem comum que pudesse ser usado para qualquer algoritmo de associação tardia. Os delegados permitem que os desenvolvedores aprendam um conceito e usem esse mesmo conceito em vários problemas de software diferentes.
Em segundo lugar, a equipe queria dar suporte a chamadas de método single ou multicast. (Representantes multicast são delegados que encadeiam várias chamadas de método. Você verá exemplos mais adiante nesta série.)
A equipe queria que os delegados oferecessem suporte à mesma segurança de tipo que os desenvolvedores esperam de todos os constructos C#.
Por fim, a equipe reconheceu que um padrão de evento é um padrão específico em que delegados ou qualquer algoritmo de associação tardia são úteis. A equipe queria garantir que o código para delegados pudesse fornecer a base para o padrão de evento .NET.
O resultado de todo esse trabalho era o suporte do delegado e do evento no C# e .NET.
Os artigos restantes nesta série abordarão recursos de linguagem, suporte à biblioteca e idiomas comuns usados quando você trabalha com delegados e eventos. Você saberá mais sobre:
- A
delegate
palavra-chave e qual código ele gera. - Os recursos na
System.Delegate
classe e como esses recursos são usados. - Como criar delegados fortemente tipados.
- Como criar métodos que podem ser invocados por meio de delegados.
- Como trabalhar com delegados e eventos usando expressões lambda.
- Como os delegados se tornam um dos blocos de construção para LINQ.
- Como os delegados são a base para o padrão de evento .NET e como eles são diferentes.
Vamos começar.