我有一个关于匿名事件处理程序的相当简短的问题:
这是我的代码:
public void AddTestControl(Control ctrl)
{
ctrl.Disposed += (o, e) => { RemoveTestControl(ctrl); };
ctrl.SomeEvent += _Control_SomeEvent;
}
public void RemoveTestControl(Control ctrl)
{
ctrl.SomeEvent -= _Control_SomeEvent;
}
Run Code Online (Sandbox Code Playgroud)
此代码是否正常,或者是否应重写代码以删除Disposed Event Handler?像这样的东西:
public void AddTestControl(Control ctrl)
{
ctrl.Disposed += _Control_Disposed;
ctrl.SomeEvent += _Control_SomeEvent;
}
public void RemoveTestControl(Control ctrl)
{
ctrl.Disposed -= _Control_Disposed;
ctrl.SomeEvent -= _Control_SomeEvent;
}
Run Code Online (Sandbox Code Playgroud)
通常,您需要从对象中删除事件处理程序以使其有资格进行垃圾回收的唯一情况是发布者对象(定义事件的对象)比订阅者对象(包含事件的对象)更长处理程序).在这种情况下,当用户超出范围时,GC将无法释放用户,因为它仍然被发布者引用.
在这种情况下,假设这是WebForms或WinForms,发布者(即Control对象)很可能是订阅者的子对象(可能是a Page或a Form),这将是第一个超出范围的对象它的对象.因此,不需要删除事件处理程序.