Existe alguma maneira de subscrição claro para um evento em VB.NET?
-
19-09-2019 - |
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.
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?