Unsubscribing events: How VB Handles it
Davy Brion posted about how events can keep object references alive. In C# to rid yourself of this issue you have to manually unwire any event handler you wired. In VB, it is a lot easier, all you have to do is use WithEvents and set the variable to nothing. This code is the VB version of Davy’s sample:
Public Class Publisher
Public Event MyEvent As EventHandler
Public Sub FireEvent()
RaiseEvent MyEvent(Me, EventArgs.Empty)
End Sub
End Class
Public Class GoodSubscriber
Implements IDisposable
Private WithEvents _publisher As Publisher
Public Sub New(ByVal publisher As Publisher)
_publisher = publisher
End Sub
Private Sub _publisher_MyEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles _publisher.MyEvent
Console.WriteLine("the publisher notified the good subscriber of an event")
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
_publisher = Nothing
End Sub
End Class
As long as the variable is declared as WithEvents any event wired up via declarative event handling will be unwired when the variable is set to Nothing.
This is yet another subtle but important example of how declarative coding styles can lead to more robust code. The above example is minimal, but when you get many events and many objects raising events, the cleanness of the VB way of handling it becomes even more important. Or in other words in C# you have to make sure you unwire each and every event, in VB you use declarative events syntax and VB handles it for you 😉