Recomendado, 2024

Escolha Do Editor

Diferença entre delegados e eventos em c #

O uso de legados e eventos desempenha um papel importante no programa orientado a eventos. Os representantes podem se referir a um método e é bastante semelhante ao ponteiro de função em C ++. Eventos notificam que alguma ação foi executada. A diferença básica entre delegados e eventos é que os representantes mantêm a referência dos métodos e o evento fornece uma maneira de acessar esse método usando delegados.

Gráfico de comparação

Base para ComparaçãoDelegadosEventos
BasicUm delegado contém a referência de um método.O evento é uma abstração em camadas fornecida aos delegados.
Sintaxedelegate return_type delegate_name (parameter_list);evento event_delegate event_name;
Palavra chaveUm delegado é declarado usando uma palavra-chave "delegado".Um evento é declarado usando uma palavra-chave "evento".
DeclaraçãoUm delegado é declarado fora de qualquer classe.Um evento é declarado dentro de uma classe.
InvocarPara invocar um método, ele deve ser encaminhado ao delegado.Para invocar um método, ele deve ser atribuído ao evento.
Covariância e ContravariânciaEles fornecem flexibilidade aos delegados.Nenhum tal conceito.
Acessorio de EventosNenhum tal conceito.Gerencia a lista dos manipuladores de eventos.
DependênciaOs delegados são independentes dos eventos.O evento não pode ser criado sem delegados.

Definição de Delegados

Em delegados C # são usados ​​como um ponteiro de função para indicar um método. É especificamente um objeto que se refere a um método que é atribuído a ele. O mesmo delegado pode ser usado para referenciar métodos diferentes, pois é capaz de manter a referência de diferentes métodos, mas um de cada vez. Qual método será invocado pelo delegado é determinado no tempo de execução. A sintaxe de declarar um delegado é a seguinte:

 delegate return_type delegate_name (parameter_list); 

Aqui, o return_type declara o tipo de valor retornado pelo método, que é chamado por delegate e delegate_name é o nome do delegado. O parâmetro_list define a lista de parâmetros exigidos pelos métodos que serão chamados pelo delegado.

Existem alguns pontos importantes a serem lembrados sobre os delegados. Pode chamar qualquer método que corresponda à sua assinatura e ao tipo de retorno. Um delegado pode chamar um método de instância ou um método estático. Se ele chamar um método de instância, ele precisará da ajuda do objeto para invocar o método. Delegados suportam multicasting, ou seja, você pode encadear os métodos que serão chamados automaticamente quando o delegado se referindo a eles for invocado. Você simplesmente tem que criar um objeto delegado e atribuir os métodos um após o outro à cadeia usando o operador “+ =”. Você também pode desencadear um método usando o operador "- =".

Os recursos que adicionam flexibilidade extra ao delegado são Covariance e Contravariance. Covariância e Contravariância permitem a condição em que o tipo de retorno e a assinatura do método atribuído ao delegado são diferentes do delegado.

  • Covariância permite que você atribua um método ao delegado onde o tipo de retorno do método é uma classe derivada da classe que especifica o tipo de retorno do delegado.
  • Contravariância permite que você atribua um método ao delegado onde o tipo de parâmetro do método é uma classe base da classe que é especificada como o parâmetro do delegado.

Definição de Eventos

Eventos são a ação executada que altera o estado de um objeto. Eventos são declarados usando delegados, sem a presença de delegados você não pode declarar eventos. Você pode dizer que um evento fornece encapsulamento aos representantes. Há dois compostos importantes ao lidar com eventos que são manipulador de eventos e eventos. Se os objetos estiverem interessados ​​no evento, ele registrará um manipulador de eventos para esse evento específico. E sempre que os eventos são acionados, os manipuladores de eventos registrados são chamados. A declaração do evento é a seguinte:

 evento event_delegate event_name; 

Aqui, "evento" é uma palavra-chave que mostra a declaração de um evento. Em seguida, event_delegate mostra o nome do delegado que está suportando o evento. Então, event_name é o nome do evento

Existem alguns pontos importantes a serem lembrados ao lidar com os eventos. Como os delegados, os eventos também podem ser multicast, ou seja, vários objetos que estão encadeados (registrados) em um manipulador de eventos, respondem quando um evento é gerado. Os manipuladores de eventos podem ser adicionados à cadeia usando o operador “+ =” e podem ser desencadeados usando o operador “- =” O método estático e de instância podem ser usados ​​como um manipulador de eventos. O acessador de eventos pode fornecer o controle da implementação da lista de manipuladores de eventos.

A interface pode conter eventos. Os eventos também podem ser abstratos, enquanto o evento baseado em acessador não pode ser abstrato. O evento pode ser virtual e ser substituído pela classe derivada.

Principais diferenças entre delegados e eventos em c #

  1. Delegar é um objeto usado como um ponteiro de função para manter a referência de um método. Por outro lado, os eventos fornecem uma abstração para os delegados.
  2. Uma palavra-chave necessária para declarar um delegado é um delegado, enquanto uma palavra-chave necessária para declarar um evento é um evento .
  3. Um delegado é declarado fora de uma classe, enquanto um evento é declarado dentro de uma classe.
  4. Para invocar um método usando um objeto delegado, o método deve ser encaminhado ao objeto delegado. Por outro lado, para invocar um método usando um objeto de evento, o método deve ser referido ao objeto de evento.
  5. Covariância e Contravariância fornecem flexibilidade extra aos objetos delegados. Por outro lado, o evento não possui tais conceitos.
  6. O Event Accessor manipula a lista de manipuladores de eventos, enquanto o delegado não possui esse conceito.
  7. Os delegados são independentes dos eventos, mas os eventos não podem ser criados sem o delegado.

Conclusão:

Os delegados são úteis porque suportam eventos e fornecem a facilidade de executar o método em tempo de execução. O acessador de eventos nos permite sincronizar os manipuladores de eventos em aplicativos multithreading.

Top