挂钩自引用事件会导致内存泄漏吗?

问题描述 投票:0回答:1

所以我有一个简单的课程:

public class GridButton : Button
{
    public event EventHandler OnClick;

    public GridButton()
    {
        this.Clicked += GridButton_Clicked;     
    }

    private void GridButton_Clicked(object sender, EventArgs e)
    {
        HandleTap();
    }

现在这是一个视图控件,我不负责放置此对象的时间。

是上面的代码是内存泄漏,还是GarbageCollector足够聪明,可以确定事件处理程序是自引用的,因此不会引起泄漏。

如果这是内存泄漏,什么是正确的解决方案?

我是否应该使用比此处所指的更多的WeakRefence

http://paulstovell.com/blog/weakevents

c# memory-leaks event-handling eventhandler
1个回答
0
投票

。NET垃圾收集器将查找并删除循环(this-> OnClick-> this.GridButton_Clicked)。

。NET中的“内存泄漏”通常在您说了一个永远不会释放的集合(例如,列表,映射,事件等)时发生(例如,全局/静态变量,或者在开始时出现)。堆栈(在程序执行期间不会超出范围),然后随着时间的推移,您会继续向其中添加更多项目,但永远不要删除它们。

例如:

public GridButton()
{
    Globals.OnRefreshClicked += Refresh;     
}
private void Refresh()
{
   ...update text, state, whatever...
}

“全局变量”是长期存在的。现在,即使您从GUI删除了该按钮,除非也删除了该事件,否则Globals.OnRefreshClicked -> this.Refresh引用将使您的对象保持活动状态,至少与Globals一样长,直到程序终止为止。

© www.soinside.com 2019 - 2024. All rights reserved.