玩弱事件
public class Test
{
public Test(Button button)
{
WeakEventManager<Button, RoutedEventArgs>.AddHandler(button, nameof(Button.Click),
(s, e) => MessageBox.Show("Tada"));
}
}
使用此代码
Test _test;
void ButtonCreate_Click(object sender, RoutedEventArgs e) => _test = new Test(button);
void ButtonDelete_Click(object sender, RoutedEventArgs e) => _test = null;
void ButtonGC_Click(object sender, RoutedEventArgs e)
{
GC.Collect(2);
GC.WaitForPendingFinalizers();
}
看起来这个事件处理程序的生命周期比我预期的要长。
这是一个演示,我单击创建 3次,然后删除和 GC ,但单击按钮仍将执行所有事件处理程序:
我的问题是这里有什么问题?
没有lambda就没有这样的问题
public class Test
{
public Test(Button button)
{
WeakEventManager<Button, RoutedEventArgs>.AddHandler(button,
nameof(Button.Click), Button_Click);
}
void Button_Click(object sender, RoutedEventArgs e) => MessageBox.Show("Tada");
}
但是another problem出现了,除非按下 GC ,否则仍会在删除之后调用事件处理程序!