Qual a diferença entre event e delegate? – c# .net orientação-a-objetos

Pergunta:


Já entendi como funciona delegate e event, mas não vi utilidade do event.
Por exemplo:

public delegate void ChangedEventHandler(object sender, BaseEventArgs e);
public ChangedEventHandler Changed;

O código acima funciona como o de baixo:

public delegate void ChangedEventHandler(object sender, BaseEventArgs e);
public event ChangedEventHandler Changed;

Se ambos funcionam da mesma forma, qual a utilidade do event?

Pelo o que entendi (se eu estiver errado, me corrijam) o event é um modificador que mostra que ele está instanciando um delegate que tem como parâmetros uma classe derivada do EventArgs e um object? E que também event pode ser colocado em interfaces?

Autor da pergunta RafaelMF

Resposta Comunidade:

O sistema de eventos é um mecanismo muito mais poderoso. Ela usa delegados como base mas ele faz mais do que isto. Ele é a implementação na linguagem do que se chama de Observer Pattern (exemplo de implementação em C#).

Note que no exemplo mostrado no link acima tudo o que precisa ser feito para ter um evento funcionando precisa ser feito pelo programador. O comando event diz ao compilador que ele deve fazer parte deste “trabalho sujo” para você. Não que ele seja muito complicado, mas certamente dá mais trabalho e é mais fácil cometer erros quando tem mais como que se preocupar.

Nada impede que você implemente este padrão de projeto por conta própria com delegados ou mesmo sem eles. Mas você vai ter que escrever todo o código necessário para isto. Terá que garantir que ele está tudo certo. Terá que escrever todo o mecanismo que gerencia os mecanismos de inscrição e desligamento do evento, além do processo de notificação.

O evento abstrai o mecanismo. Ele é um conceito em mais alto nível. De uma certa forma podemos dizer que tema a mesma relação do abordado nessa pergunta.

Uma forma de ver o que um evento faz é assim:

private ChangedEventHandler ChangedField;
public void AddChangedHandler(ChangedEventHandler handler) {
    this.ChangedField = (ChangedEventHandler)Delegate.Combine(this.Changed, handler);
}
public void RemoveChangedHandler(ChangedEventHandler handler) {
    this.ChangedField = (ChangedEventHandler)Delegate.Remove(this.Changed, handler);
}

O compilador implementa isto para você. E não é tão simples fazer certo porque ele implementa isto através de um MulticastDelegate. Novamente, nada impede que você faça isto e pode até precisar se precisar fazer algo mais específico. Ele também dá mais segurança impedindo que certas operações sejam feitas com os delegados. Sem o seu uso, é possível levantar um evento externamente, é possível substituir um delegado indevidamente.

No mais seu entendimento está correto. Não espere muita mágica nele. Ele não faz nada que não pode ser feito sem ele de uma forma “pior”.

Se você não liga pela facilidade que ele dá, pelo menos deveria usar para deixar semanticamente claro que você está usando um evento e não só um delegado. È também uma questão de intenção. È uma informação útil para o programador entender melhor o código, permite o compilador fazer algo a mais e permite que outros componentes interajam com ele de forma mais específica, já que ele sabe melhor para que esses delegados estão sendo usados e como eles foram implementados.

Experimenta usa das duas formas e pega o código CIL gerado pelo compilador para ver como muda.

Nem todo mundo sabe que o C# nasceu por causa de uma desavença da Microsoft com a Sun – criadora do Java – por causa deste recurso. Pelo menos é o que diz a lenda. Sorte nossa 🙂

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *