我想知道将对象设置为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;
等...
这会导致内存泄漏吗?
答案 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?"
结论:你应该删除 代表们来自活动 课外本身;即何时 你订阅了外部事件 应该在你结束订阅时结束 完成。如果不这样做将继续 你的对象活着的时间比 必要的。