Damien
Damien

Reputation: 1502

C# Explicitly Removing Event Handlers

I was wondering if setting an object to null will clean up any eventhandlers that are attached to the objects events...

e.g.

Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

etc...

Will this cause a memory leak?

Upvotes: 14

Views: 9833

Answers (3)

Pavel Minaev
Pavel Minaev

Reputation: 101555

If there are no other references to button anywhere, then there is no need to remove the event handler here to avoid a memory leak. Event handlers are one-way references, so removing them is only needed when the object with events is long-lived, and you want to avoid the handlers (i.e. objects with handler methods) from living longer than they should. In your example, this isn't the case.

Upvotes: 16

Gishu
Gishu

Reputation: 136593

Summary: You need to explicitly unsubscribe when the event source/publisher is long-lived and the subscribers are not. If the event source out-lives the subscribers, all registered subscribers are kept "alive" by the event source (not collected by the GC) unless they unsubscribe (and remove the reference to themselves from the event publisher's notification list)

Also this is a duplicate of Is it necessary to explicitly remove event handlers in C# and has a good title n answer. So voting to close.

Upvotes: 11

James Kolpack
James Kolpack

Reputation: 9382

See the discussion here under "The final question: do we have to remove event handlers?"

Conclusion: you should remove delegates from events when they reach outside the class itself; i.e. when you subscribe to external events, you should end your subscription when you are done. Failing to do so will keep your object alive longer than necessary.

Upvotes: 8

Related Questions