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

C#显式删除事件处理程序,c#,events,memory-leaks,garbage-collection,C#,Events,Memory Leaks,Garbage Collection,我想知道将对象设置为null是否会清除附加到对象事件的任何EventHandler e、 g 等等 这会导致内存泄漏吗?请参阅讨论 结论:你应该删除 代表到达时将从活动中退出 在课堂之外;i、 e.什么时候 你订阅外部活动,你 当您 完成了。如果不这样做,将保持 您的对象的生存时间比 必要的 摘要:当事件源/发布服务器长期存在而订阅服务器不存在时,需要显式取消订阅。如果事件源超出订阅服务器,则所有注册的订阅服务器将由事件源保持“活动”(不由GC收集),除非它们取消订阅(并从事件发布者的通知列表中

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

e、 g

等等

这会导致内存泄漏吗?

请参阅讨论

结论:你应该删除 代表到达时将从活动中退出 在课堂之外;i、 e.什么时候 你订阅外部活动,你 当您 完成了。如果不这样做,将保持 您的对象的生存时间比 必要的


摘要:当事件源/发布服务器长期存在而订阅服务器不存在时,需要显式取消订阅。如果事件源超出订阅服务器,则所有注册的订阅服务器将由事件源保持“活动”(不由GC收集),除非它们取消订阅(并从事件发布者的通知列表中删除对自身的引用)

这也是一个复制品
有一个很好的标题和答案。因此投票关闭。

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

我看到了问答。我的问题更加直截了当,需要一个更简单的答案。这是否意味着应用程序条的事件处理程序也不需要显式删除(例如statechanged)?情况正好相反。AppBar是一个长期存在的对象,事件处理程序至少会在AppBar处于活动状态时保持代理引用的对象处于活动状态,而您可能不希望发生这种情况。另一方面,如果处理程序是窗口中拥有该条的方法,则这无关紧要。
Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;

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