Pergunta

Eu tenho o seguinte código para deixar a responder GUI a uma mudança na coleção.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

Primeiro de tudo isso é uma boa maneira de fazer isso?

Segundo: qual é o código para sair deste evento? É a mesma coisa, mas com -? = (E, em seguida, o método anônimo completa de novo)

Foi útil?

Solução

Se você precisar cancelar a inscrição de um evento, você precisa de uma referência instanced. Infelizmente, isso significa que você não pode usar essa sintaxe particular.

Outras dicas

Antes de mais nada ... sim é uma boa maneira de fazê-lo, é limpo forma, pequeno e fácil de ler e entender ... a ressalva, claro, é "A menos que mais tarde você quiser cancelar a inscrição".

Eu acredito Jon Skeet apontou antes que "A especificação explicitamente não garante o comportamento de qualquer forma quando se trata de equivalência de delegados criados com métodos anônimos."

Então, se você precisa cancelar a assinatura do evento em um momento posterior, você seria melhor para realmente criar uma instância de delegado para que possa pendurar a referência para mais tarde.

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

É uma maneira ok para ir, a menos que myObservableCollection vai viver mais do que 'isto', caso em que você pode acabar com um vazamento de memória, como o delegado que é criado nos bastidores irá conservar uma referência ao seu ' esta, que irá mantê-lo vivo. Se você estiver criando várias vezes e 'destruir' o que está ouvindo o caso, você vai achar que eles não estão sendo coletados pelo coletor de lixo.

Se este é um problema, você pode ir a rota sugerida nas respostas, conservando uma referência para o manipulador, que é necessário criar primeiro.

Outra solução é usar referências fracas para criar um manipulador de eventos que permitirá que o assinante a ser recolhidos se não houver outras referências. Eu explorei esta solução em esta pergunta e resposta .

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