C# Sintaxe de remoção de eventos
Pergunta
Estou confuso com a sintaxe para remover manipuladores de eventos em C#.
Something += new MyHandler(HandleSomething); // add
Something -= new MyHandler(HandleSomething); // remove
O "novo" cria um novo objeto em cada linha, então você adiciona um objeto e solicita que ele remova um objeto diferente.
O que realmente está acontecendo sob as cobertas que isso pode funcionar?
Com certeza não é óbvio da sintaxe.
Solução
O += e o -= são atalhos de sintaxe para métodos internos internos chamados add () e remover (), que adicionam ou removem um ponteiro a uma lista interna vinculada de delegados que o delegado possui como campo privado. Quando você é executado, ele inicia na cabeça da lista vinculada e examina cada delegado na lista, um de cada vez, até encontrar um que seja "igual" ao que você passou para o método Remow (). (usando -= sintaxe)
Em seguida, ele remove aquele da lista vinculada e remende a lista vinculada para reter sua conectividade ...
Nesse contexto, o método 'igual' (para um delegado ()) é substituído para que ele compare apenas o alvo do delegado e o métodoptr, que será o mesmo, mesmo que você tenha criado um novo delegado para passar ...
Outras dicas
O "New Myhandler" é realmente redundante. Você pode simplesmente fazer
Something += HandleSomething; // add
Something -= HandleSomething; // remove
Todos os eventos em C# são delegados multicast, portanto, o += e -= sintaxe indica que você está adicionando/removendo um delegado à lista de delegados que serão chamados.
Quanto ao que está acontecendo nos bastidores, a melhor explicação que eu encontrei é Jon Skeet's.
Você pode pensar nos eventos como métodos de espaço reservado para a lógica delegada que é executada quando o evento é levantado. Um único evento pode ter vários assinantes (multicasting); portanto, o += e -= sintaxe é como um único manipulador de eventos é anexado ou removido. Simplesmente fazer a atribuição redefiniria as assinaturas do evento, o que poderia causar efeitos colaterais indesejados.
EDITAR: esse link explica mais sobre eventos em C#