58 lines
2.0 KiB
Plaintext
58 lines
2.0 KiB
Plaintext
![]() |
Subscribing to events without unsubscribing later on can lead to memory leaks or even duplicate subscriptions, i.e. code which is executed multiple times by mistake.
|
||
|
|
||
|
Even if there is no problem right now, the code is more difficult to review and a simple refactoring can create a bug. For example the lifetime of the event publisher could change and prevent subscribers from being garbage collected.
|
||
|
|
||
|
There are patterns to automatically unsubscribe, but the simplest and most readable solution remains to unsubscribe from events explicitly using ``RemoveHandler``.
|
||
|
|
||
|
This rule raises an issue when a class subscribes to an even using ``AddHandler`` without explicitly unsubscribing with ``RemoveHandler``.
|
||
|
|
||
|
== Noncompliant Code Example
|
||
|
|
||
|
----
|
||
|
Class MyEventProcucer
|
||
|
Public Shared Event EventFired As EventHandler
|
||
|
End Class
|
||
|
|
||
|
Public Class MyEventSubscriber
|
||
|
Implements IDisposable
|
||
|
|
||
|
Public Sub New()
|
||
|
AddHandler MyEventProcucer.EventFired, AddressOf c_EventFired 'Noncompliant
|
||
|
End Sub
|
||
|
|
||
|
Private Sub c_EventFired(sender As Object, e As EventArgs)
|
||
|
End Sub
|
||
|
|
||
|
Public Sub Dispose() Implements IDisposable.Dispose
|
||
|
End Sub
|
||
|
End Class
|
||
|
----
|
||
|
|
||
|
== Compliant Solution
|
||
|
|
||
|
----
|
||
|
Class MyEventProcucer
|
||
|
Public Shared Event EventFired As EventHandler
|
||
|
End Class
|
||
|
|
||
|
Public Class MyEventSubscriber
|
||
|
Implements IDisposable
|
||
|
|
||
|
Public Sub New()
|
||
|
AddHandler MyEventProcucer.EventFired, AddressOf c_EventFired
|
||
|
End Sub
|
||
|
|
||
|
Private Sub c_EventFired(ByVal sender As Object, ByVal e As EventArgs)
|
||
|
End Sub
|
||
|
|
||
|
Public Sub Dispose() Implements IDisposable.Dispose
|
||
|
RemoveHandler MyEventProcucer.EventFired, AddressOf c_EventFired
|
||
|
End Sub
|
||
|
End Class
|
||
|
----
|
||
|
|
||
|
== See
|
||
|
|
||
|
* https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events#unsubscribing[How to subscribe to and unsubscribe from events (C# Programming Guide)]
|
||
|
* https://michaelscodingspot.com/5-techniques-to-avoid-memory-leaks-by-events-in-c-net-you-should-know/[5 Techniques to avoid Memory Leaks by Events in C# .NET you should know]
|