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

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

例如

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

等等…

这会导致内存泄漏吗?

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

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

这也是一个副本是否有必要在C#中显式删除事件处理程序并具有良好的标题n答案。 所以投票结束。

请参阅“最后一个问题:我们是否必须删除事件处理程序?”中的讨论。

结论:当事件到达类本身之外时,您应该从事件中删除委托; 即,当您订阅外部事件时,您应该在完成后结束订阅。 如果不这样做,将使您的对象保持超过必要的时间。