所以我有一个简单的课程:
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
)。
。NET中的“内存泄漏”通常在您说了一个永远不会释放的集合(例如,列表,映射,事件等)时发生(例如,全局/静态变量,或者在开始时出现)。堆栈(在程序执行期间不会超出范围),然后随着时间的推移,您会继续向其中添加更多项目,但永远不要删除它们。
例如:
public GridButton()
{
Globals.OnRefreshClicked += Refresh;
}
private void Refresh()
{
...update text, state, whatever...
}
“全局变量”是长期存在的。现在,即使您从GUI删除了该按钮,除非也删除了该事件,否则Globals.OnRefreshClicked -> this.Refresh
引用将使您的对象保持活动状态,至少与Globals
一样长,直到程序终止为止。