C#显式删除事件处理程序

时间:2009-07-29 04:41:33

标签: c# events memory-leaks garbage-collection

我想知道将对象设置为null是否会清除附加到对象事件的任何事件处理程序...

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;

等...

这会导致内存泄漏吗?

3 个答案:

答案 0 :(得分:16)

如果在任何地方没有对button的其他引用,则不需要在此处删除事件处理程序以避免内存泄漏。事件处理程序是单向引用,因此仅当具有事件的对象长寿时才需要删除它们,并且您希望避免处理程序(即具有处理程序方法的对象)比它们的生存时间更长应该。在您的示例中,情况并非如此。

答案 1 :(得分:11)

摘要:当事件源/发布者长寿且订阅者不是时,您需要明确取消订阅。如果事件源超过订阅者,则所有注册订阅者将被活动源“保持活跃”(未由GC收集),除非他们取消订阅(并从活动发布者的通知列表中删除对自己的引用)

这也是重复的 Is it necessary to explicitly remove event handlers in C#并且答案很好。投票结束。

答案 2 :(得分:8)

参见讨论here under "The final question: do we have to remove event handlers?"

  

结论:你应该删除   代表们来自活动   课外本身;即何时   你订阅了外部事件   应该在你结束订阅时结束   完成。如果不这样做将继续   你的对象活着的时间比   必要的。

相关问题