Atenção: esse artigo tem dois vídeos complementares.
Clique e assista o primeiro!

Clique e assista o segundo!

De que se trata o artigo

Este artigo trata de um poderoso recurso oferecido pelo .Net Framework, chamado delegate. A ideia deste artigo é abordar este tema de forma clara, simplificada e prática tendo como objetivo a apresentação das vantagens significativas que este recurso oferece no desenvolvimento de sistemas.

Para que serve

Como principais vantagens, pode-se dizer que a utilização de delegates favorece e facilita em muito a reutilização de código, aumento da flexibilidade do design, extensibilidade das funcionalidades e execução de operações assíncronas.

Em que situação o tema é útil

Dentro da estrutura de objetos de um sistema é comum a necessidade de comunicação entre as classes, seja para notificação de eventos ocorridos, transferência de dados entre outras operações. Partindo deste princípio, os delegates são utilizados para cumprir o papel de agente notificador, pois seu conceito está fortemente ligado ao mecanismo de eventos que o .Net Framework possui e que permite a comunicação entre objetos.

Delegates

Os delegates promovem diversas vantagens no desenvolvimento de aplicações, e como uma destas vantagens nós podemos apresentar a criação de mecanismos assíncronos para execução de métodos. Neste artigo é descrito como é possível criar eventos e operações assíncronas dentro de uma aplicação e na seção prática é construída uma aplicação que apresenta um gráfico de barras que é atualizado automaticamente a cada vez que alguma alteração ocorrer em uma determinada tabela dentro do SQL Server. Desta forma não há a necessidade de a aplicação ficar consultando a tabela e comparando se há diferenças, assim que a tabela sofrer a alteração, uma mensagem é enviada para a aplicação e em seguida é acionado um evento para atualizar o gráfico.

O tipo delegate nos permite encapsular a referência de um método dentro de um objeto e este mesmo objeto pode ser transferido entre chamadas através das classes de uma aplicação para ser invocado em algum outro ponto do programa, desta forma não se sabendo em tempo de compilação qual método será invocado. Simplificando esta ideia inicial, por exemplo, pode-se encapsular um método dentro de um objeto e passar este objeto como argumento entre chamadas de métodos e em algum determinado ponto do código resgatar esta referência e invocar o método pelo qual o delegate foi inscrito. Assim o comportamento de execução do método será realizado de acordo com sua referência assinada.

Delegates possuem estreita ligação com a estrutura de métodos e é declarado com as mesmas características de um método, possuem valor de retorno e parâmetros. Uma importante observação é que para inscrever um método através de um delegate, a declaração do método e do delegate devem ser compatíveis. Se um método tem como retorno um tipo inteiro e dois parâmetros de entrada do tipo string o delegate que irá representá-lo em uma chamada anônima deverá possuir uma estrutura idêntica, caso contrário o código fonte não irá compilar.

O conceito de delegate se originou na ideia de função para ponteiros que é bastante difundida dentro do universo C/C++. Uma relevante e considerável melhoria que o .Net trouxe em relação aos ponteiros para função do C/C++ não gerenciado é a vantagem dos delegates serem tipos seguros, pois as funções para ponteiros são representadas apenas pelo endereço em memória e não dizem nada a respeito da quantidade de parâmetros ou tipos e valor de retorno. Com isso, se em tempo de desenvolvimento o programador se equivocar na declaração destas estruturas, este erro somente será descoberto em tempo de execução e não se tem como prever o comportamento da execução deste código. Já não é assim com os delegates, pois possuem uma estrutura de metadados bem definida que descreve seus atributos, não acontecendo o cenário citado anteriormente.

...
Quer ler esse conteúdo completo? Tenha acesso completo