2009-11-10 39 views
3

在C#中,我習慣於清除每個訂閱我在Dispose()中的自定義事件,以避免忘記取消訂閱我的事件的訂閱者的內存泄漏。有什麼方法可以清除訂閱VB.NET中的事件嗎?

這很簡單,只需調用MyEvent = null即可,因爲C#編譯器會自動生成一個委託字段。不幸的是,在VB.NET中,似乎沒有簡單的方法來做到這一點。我想出的唯一解決方案是編寫一個Custom Event,添加自定義的添加和刪除處理程序,調用Delegate.Combine/Delegate.Remove,這基本上是C#編譯器的功能。但是爲了能夠清除訂閱而必須爲每個事件執行此操作似乎對我來說有點「過度」。

有沒有人有另一個想法來解決這個問題?謝謝。

回答

5

在VB.Net中完全一樣。對於每個事件,編譯器automatically creates a delegate field就像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

謝謝!沒有看到該文檔部分,非常有幫助。在使用反射時,只是將一些變量設置爲null才顯得很重;但在調試時斷言每個字段都已正確設置爲null非常有用。 – 2009-11-10 12:39:11

+0

我在想也許可能有一個通用的ClearAllSubscriptions方法,它使用反射來處理任何類型:然後Clear方法中所有需要的都是ClearAllSubscriptions Me – MarkJ 2009-11-10 13:52:20

0

我只知道VB.NET的含義,但AddHandler/RemoveHandler怎麼樣?

+0

AddHandler/RemoveHandler是C#中+ =和 - =的VB.NET等價物。由於我不知道每個用戶(除非我讓事件自定義),我不能每次都刪除處理程序。 – 2009-11-10 10:41:14

相關問題