Dam*_*ien 14 c# events garbage-collection memory-leaks
我想知道将对象设置为null是否会清除附加到对象事件的任何事件处理程序...
例如
Button button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;
button = new Button();
button.Click += new EventHandler(Button_Click);
button = null;
Run Code Online (Sandbox Code Playgroud)
等等...
这会导致内存泄漏吗?
Pav*_*aev 17
如果没有其他button
任何引用,那么就不需要在此处删除事件处理程序以避免内存泄漏.事件处理程序是单向引用,因此仅当具有事件的对象长寿时才需要删除它们,并且您希望避免处理程序(即具有处理程序方法的对象)的生存时间超过它们应该的时间.在您的示例中,情况并非如此.
Gis*_*shu 11
简介:当事件源/发布者长寿且订阅者不是时,您需要显式取消订阅.如果事件源超过订阅者,则所有注册订阅者将被活动源(未由GC收集)保持"活着",除非他们取消订阅(并从活动发布者的通知列表中删除对自己的引用)
这也是一个副本 是否有必要在C#中显式删除事件处理程序并具有良好的标题n答案.所以投票结束.
请参阅"最后一个问题:我们是否必须删除事件处理程序?"中的讨论.
结论:当事件到达课堂外时,你应该从事件中删除代理人; 即,当您订阅外部事件时,您应该在完成后结束订阅.如果不这样做,将使您的对象保持超过必要的时间.
归档时间: |
|
查看次数: |
9366 次 |
最近记录: |