Есть ли способ очистить подписку на событие в VB.NET? - PullRequest
3 голосов
/ 10 ноября 2009

В C # я взял за привычку очищать каждую подписку на свои пользовательские события в Dispose(), чтобы избежать утечек памяти подписчиков, забывших отказаться от подписки на мои события.

Это было очень просто сделать, просто вызвав MyEvent = null, поскольку компилятор C # автоматически генерирует поле делегата. К сожалению, в VB.NET, кажется, нет простого способа сделать это. Единственное решение, которое я придумал, - написать Custom Event, добавив пользовательские обработчики добавления и удаления, вызывающие Delegate.Combine / Delegate.Remove, в основном то, что делает компилятор C #. Но необходимость делать это для каждого события просто для того, чтобы иметь возможность очистить подписки, кажется мне немного «излишней».

У кого-нибудь есть другая идея, чтобы решить эту проблему? Благодаря.

Ответы [ 2 ]

6 голосов
/ 10 ноября 2009

Точно так же в VB.Net. Компилятор автоматически создает поле делегата для каждого события, как и компилятор C #, но в VB это поле скрыто. Однако вы можете получить доступ к переменной из своего кода - она ​​всегда называется XXXEvent, где XXX - это имя события.

Таким образом, вы можете легко очистить подписки на событие, как в C #:

Public Class Class1
  Implements IDisposable
  Event MyEvent()

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

Я также думаю, что должна быть возможность использовать отражение, чтобы автоматически найти все скрытые переменные-делегаты и очистить их. Тогда их не нужно перечислять в методе Clear.

0 голосов
/ 10 ноября 2009

У меня есть только смутные знания о VB.NET, но как насчет AddHandler / RemoveHandler?

...