Introdução a delegados e eventos em C#

Os delegados fornecem um mecanismo de associação tardia no .NET. Associação tardia significa que você cria um algoritmo em que o chamador também fornece pelo menos um método que implementa a parte do algoritmo.

Por exemplo, considere classificar uma lista de estrelas em um aplicativo de astronomia. Você pode optar por classificar as 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 ordenações de classificação.

Esses tipos de soluções foram usados no software por 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 à frente nesta série, o código C# que você escreve para algoritmos como esse é de fortemente tipado. 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 ter 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.

Metas de design da linguagem 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 usada qualquer algoritmo de associação tardia. Delegados permitem aos desenvolvedores aprender um conceito e usar esse mesmo conceito em muitos 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 delegados para dar suporte à mesma segurança de tipos que os desenvolvedores esperam de todos os constructos de C#.

Por fim, a equipe reconheceu que um padrão de eventos é um padrão específico em que delegados ou qualquer algoritmo de associação tardia é útil. A equipe quis 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 demais artigos nessa série abordarão os recursos da linguagem, o suporte da biblioteca e as expressões comuns que são usadas ao trabalhar com delegados e eventos. Você saberá mais sobre:

  • A palavra-chave delegate e qual código ela gera.
  • Os recursos na classe System.Delegate 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 eventos e delegados 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 do .NET e como eles são diferentes.

Vamos começar.

Próximo