挂接一个自引用的事件会导致内存泄漏吗?
Does hooking up an event that is self referencing cause a memory leak?
所以我有一个简单的 class:
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
像这里列出的那个吗?
.NET 垃圾收集器将查找并删除循环 (this
-> OnClick
-> this.GridButton_Clicked
)。
"Memory leaks" 在 .NET 中,当您说一个永远不会被释放的集合(例如列表、地图、事件等)(例如 global/static 变量,或在堆栈的开头向上,在程序期间不会超出范围),然后随着时间的推移不断向其中添加更多项目,但永远不要删除它们。
例如:
public GridButton()
{
Globals.OnRefreshClicked += Refresh;
}
private void Refresh()
{
...update text, state, whatever...
}
其中 "Globals" 是任何长寿的东西。现在,即使您从 GUI 中删除此按钮,除非您也删除该事件,否则 Globals.OnRefreshClicked -> this.Refresh
引用将使您的对象保持活动状态,至少与 Globals
一样长,这可能会持续到程序终止。
所以我有一个简单的 class:
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
像这里列出的那个吗?
.NET 垃圾收集器将查找并删除循环 (this
-> OnClick
-> this.GridButton_Clicked
)。
"Memory leaks" 在 .NET 中,当您说一个永远不会被释放的集合(例如列表、地图、事件等)(例如 global/static 变量,或在堆栈的开头向上,在程序期间不会超出范围),然后随着时间的推移不断向其中添加更多项目,但永远不要删除它们。
例如:
public GridButton()
{
Globals.OnRefreshClicked += Refresh;
}
private void Refresh()
{
...update text, state, whatever...
}
其中 "Globals" 是任何长寿的东西。现在,即使您从 GUI 中删除此按钮,除非您也删除该事件,否则 Globals.OnRefreshClicked -> this.Refresh
引用将使您的对象保持活动状态,至少与 Globals
一样长,这可能会持续到程序终止。