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.

Foi útil?

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#

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