Pergunta

Uma coisa que eu estou preocupado com é que eu descobri duas maneiras de registrar delegados para eventos.

  1. OnStuff + = this.Handle;
  2. OnStuff + = new StuffEventHandler (this.Handle);

O primeiro é limpa, e faz sentido fazer "OnStuff - = this.Handle;" Para cancelar o registro do evento ... Mas com o último caso, que devo fazer "OnStuff - = new StuffEventHandler (this.Handle);"? Parece que eu não estou remover qualquer coisa, desde que eu estou jogando em outra referência StuffEventHandler. O evento comparar o delegado por referência? Estou preocupado que eu poderia iniciar um pool de memória desagradável aqui. Me pega? Eu não tenho a referência à "nova StuffEventHandler" Eu registrado anteriormente.

Qual é a desvantagem de fazer # 1?

O que é vantagem de fazer # 2?

Foi útil?

Solução

Você não precisa se preocupar em manter uma referência para o delegado originalmente registrada, e você não vai iniciar um "pool de memória desagradável".

Quando você chama "OnStuff - = new StuffEventHandler (this.Handle);" o código de remoção faz não comparar o delegado que você está removendo por referência: ele verifica a igualdade comparando referências ao método de destino (s) que o delegado vai chamar, e remove os delegados correspondentes de "OnStuff" .

A propósito, "OnStuff" em si é um objeto delegado (a palavra-chave evento que eu suponho que você tem em sua declaração simplesmente restringe a acessibilidade do delegado).

Outras dicas

O número um é apenas taquigrafia que irá gerar o mesmo MSIL como o 2º um, pelo tipo de compilação que vai olhar para this.Handle e inferir o delegado instanciar. Mas você nunca deve unsubscribe usando nova.

Portanto, não há diferença entre o 2, apenas um pouco de açúcar sintático para tornar o nosso código mais limpo.

Eu estava sob a impressão de que 2 é o açúcar sintaxe apenas. Eles devem ser exatamente a mesma coisa.

Se bem me lembro, a primeira alternativa é o açúcar meramente sintática para o segundo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top