É seguro para adicionar delegados para eventos com nova palavra-chave?
Pergunta
Uma coisa que eu estou preocupado com é que eu descobri duas maneiras de registrar delegados para eventos.
- OnStuff + = this.Handle;
- 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?
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.