我正在动态创建一个包含许多嵌套菜单项的上下文菜单。每次显示上下文菜单时,我清除菜单并重新创建菜单项。我是否需要取消订阅这些menuitem点击活动?我想当我清除ContextMenu.Items列表时,垃圾收集器会拾取菜单项,我不需要担心它们。
void Window_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
if (this.ContextMenu == null)
ContextMenu = new ContextMenu();
else
ContextMenu.Items.Clear();
AddMenuItemsToContextMenu();
}
void AddMenuItemsToContextMenu()
{
//create many nested menu items
foreach (A in AList)
{
MenuItem item = new MenuItem();
item.Header = A.Label;
item.Click += MenuItem_Click;
ContextMenu.Items.Add(item);
//possibly add more menu items to this menu item
}
}
答案 0 :(得分:2)
执行item.Click += MenuItem_Click;
MenuItem
时,Form
会保留对ContextMenu.Items.Clear();
的引用,因此一旦删除additional reference -> object publishing event -> object subscribing to event
中对象的最后一个引用,垃圾收集器就会最终收集集合中的哪些项目,这些项目还将收集在其中创建的事件。
可以让你陷入困境的是当发布事件的类是一个静态对象或者对发布对象的意外的附加引用被保存在其他地方然后那个引用链({{1}})可以保持最后一个订阅对象的活动时间超过预期。