Introdução aos delegados e eventos em C#
Os delegados fornecem um mecanismo de vinculação tardia no .NET. Ligação Tardia significa que você cria um algoritmo onde 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 a 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 ordens de classificação.
Estes tipos de soluções têm sido utilizados em software há meio século. O conceito de delegado de linguagem C# fornece suporte a linguagem de primeira classe e segurança de tipo em torno do conceito.
Como você verá mais adiante nesta série, o código C# que você escreve para algoritmos como este é seguro para digitação. O compilador garante que os tipos correspondam para argumentos e tipos de retorno.
Os ponteiros de função suportam cenários semelhantes, onde 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 linguagem para delegados
Os designers de linguagem enumeraram vários objetivos para o recurso que eventualmente se tornaram delegados.
A equipe queria uma construção de linguagem comum que pudesse ser usada para qualquer algoritmo de ligação tardia. Os delegados permitem que os desenvolvedores aprendam um conceito e usem esse mesmo conceito em muitos problemas de software diferentes.
Em segundo lugar, a equipe queria oferecer suporte a chamadas de método único e multicast. (Delegados de 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 suportassem o mesmo tipo de segurança que os desenvolvedores esperam de todas as construções em C#.
Finalmente, a equipe reconheceu que um padrão de evento é um padrão específico onde delegados, ou qualquer algoritmo de vinculação tardia, é útil. 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 foi o suporte a delegados e eventos em C# e .NET.
Os artigos restantes desta série abordarão recursos de idioma, suporte a bibliotecas e expressões idiomáticas comuns usadas quando você trabalha com delegados e eventos. Você aprenderá sobre:
- A
delegate
palavra-chave e o código que gera. - Os recursos na
System.Delegate
classe e como esses recursos são usados. - Como criar delegados seguros para tipos.
- Como criar métodos que podem ser invocados através de delegados.
- Como trabalhar com delegados e eventos usando expressões lambda.
- Como os delegados se tornam um dos blocos de construção para o LINQ.
- Como os delegados são a base para o padrão de evento .NET e como eles são diferentes.
Vamos começar.