Pergunta

Em C #, tomei o hábito de limpar a cada assinaturas de meus eventos personalizados em Dispose() para vazamentos de memória evitar de assinantes esquecendo cancelar a inscrição dos meus eventos.

Foi muito simples, você simplesmente chamando MyEvent = null desde o compilador C # gera automaticamente um campo delegado. Infelizmente, em VB.NET, não parece haver nenhuma maneira simples de fazer isso. A única solução que eu vim com era escrever um Custom Event, acrescentando manipuladores Adicionar personalizado e remover chamando Delegate.Combine / Delegate.Remove, basicamente o que o compilador C # faz. Mas ter que fazer isso para cada evento apenas para ser capaz de limpar as assinaturas parece um pouco 'exagero' para mim.

Alguém tem outra idéia para resolver este problema? Obrigado.

Foi útil?

Solução

É exatamente o mesmo em VB.Net. O compilador automaticamente cria um campo delegado para cada evento , assim como o compilador C #, mas em VB campo está escondido. No entanto, você pode acessar a variável do seu código - é sempre chamado XXXEvent, onde XXX é o nome do evento.

Assim, você pode facilmente assinaturas claras para o evento, assim como em C #:

Public Class Class1
  Implements IDisposable
  Event MyEvent()

  Sub Clear() Implements IDisposable.Dispose
    Me.MyEventEvent = Nothing ' clear the hidden variable '
  End Sub
End Class

Eu também estou pensando que deve ser possível usar a reflexão para encontrar automaticamente todas as variáveis ??delegado escondidos, e eliminá-los. Em seguida, eles não têm que ser listados no método Clear.

Outras dicas

Eu tenho apenas uma vaga conhecimento do VB.NET, mas que sobre AddHandler / RemoveHandler?

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