我有一个Windows.Forms应用程序,其中ListBox填充了Account对象。 当用户从列表中选择一个帐户时,我附上一个EventHandler,负责在用户查看时更新所选的帐户交易。
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
var selected = listBox1.SelectedItem as Account;
if (selected != null)
{
UpdateTransactions(selected);
selected.OnNewTransaction += (s, a) => UpdateTransactions(selected);
}
}
然后我的问题如下;一旦用户从列表中选择另一个帐户并且所选帐户超出范围,该事件处理程序是否会自动处理? 或者它是否继续留在上面,然后如果用户再次选择同一个帐户又分配了另一个处理程序,从而创建了一个内存泄漏?
答案 0 :(得分:3)
它仍然存在,因此每次用户再次选择同一帐户时,都会再次分配。
为了再次分离事件,你应该调整你附加事件的方式,以保持对它的引用:
EventHandlerType handler = (s, a) => UpdateTransactions(selected);
selected.OnNewTransaction += handler;
// When you want to remove the handler do this (make sure you "store" handler somewhere)
selected.OnNewTransaction -= handler;
答案 1 :(得分:1)
当Account
对象被自己收集用于垃圾时,事件处理程序只是垃圾收集的候选者。所以,是的,句柄继续存在,除非你没有明确地将它们从Account
对象中分离出来,是的,事件将包含你附加到它的所有句柄。
答案 2 :(得分:0)
您需要手动分离