Ao usar os problemas do myDelegate -= eventHandler
ReSharper (versão 6):
Delegar subtração tem resultado imprevisível
O racional por trás disso é explicado pelo JetBrains aqui . A explicação faz sentido e, depois de ler, duvido de todos os meus usos -
nos delegados.
Como, então ,
- posso gravar um evento não automático sem deixar o ReSharper mal-humorado?
- ou, existe uma maneira melhor e / ou "correta" de implementar isso?
- ou posso simplesmente ignorar o ReSharper?
Aqui está o código simplificado:
public delegate void MyHandler (object sender);
MyHandler _myEvent;
public event MyHandler MyEvent
{
add
{
_myEvent += value;
DoSomethingElse();
}
remove
{
_myEvent -= value; // <-- ReSharper warning here
}
}
Respostas:
Não tenha medo! A primeira parte do aviso do ReSharper se aplica apenas à remoção de listas de delegados. No seu código, você está sempre removendo um único delegado. A segunda parte fala sobre a ordem dos delegados após a remoção de um delegado duplicado. Um evento não garante uma ordem de execução para seus assinantes, portanto também não afeta você.
O ReSharper está emitindo esse aviso porque a subtração de delegação multicast pode ter problemas, não está condenando totalmente o recurso de idioma. Felizmente, essas dicas estão em casos extremos e é improvável que você as encontre se estiver apenas instrumentando eventos simples. Não há melhor maneira de implementar seus próprios
add
/remove
manipuladores, você só precisa prestar atenção.Eu sugiro que você rebaixe o nível de aviso do ReSharper para essa mensagem para "Dica", para que você não seja dessensibilizado com os avisos deles, que geralmente são úteis.
fonte
Delegate
que não sobrecarregue+
e-
.)PIT OF SUCCESS IS THAT WAY --->
.Delegate.Combine
que "aplaina" os delegados de difusão seletiva; portanto, se for dado aos delegados [X, Y] e Z, não será possível determinar se o resultado deve ser [X, Y, Z] ou [[ X, Y], Z] (o último delegado mantendo o[X,Y]
delegado como seuTarget
e oInvoke
método desse delegado como seuMethod
).Você não deve usar delegados diretamente para somar ou subtrair. Em vez disso, seu campo
Em vez disso, também deve ser declarado como um evento. Isso resolverá o problema sem arriscar sua solução e ainda terá o benefício do uso de eventos.
O uso da soma ou subtração do delegado é perigoso porque você pode perder eventos ao simplesmente atribuir o delegado (conforme declaração, o desenvolvedor não inferirá diretamente que este é um delegado de difusão seletiva como quando é declarado como um evento). Apenas para exemplificar, se a propriedade mencionada nesta pergunta não foi sinalizada como um evento, o código abaixo fará com que as duas primeiras atribuições sejam PERDIDAS, porque alguém simplesmente atribuiu ao delegado (o que também é válido!).
Ao atribuir o Method3, perdi completamente as duas assinaturas iniciais. O uso do evento evitará esse problema e, ao mesmo tempo, removerá o aviso ReSharper.
fonte
defina-o como = null em vez de usar - =
fonte
remove
método de um evento não deve remover todos os manipuladores, mas o manipulador que foi solicitado a ser removido.