订阅事件会导致内存泄漏吗?
也就是说,如果在给定的页面中我做了
public TestPage()
{
this.InitializeComponent();
myButton.Click += MyButton_Click;
}
private void MyButton_Click(object sender, RoutedEventArgs e)
{
Debug.WriteLine("Hello");
}
我是否需要致电
myButton.Click += MyButton_Click;
如果是,我应该在哪里打电话?
答案 0 :(得分:4)
不,当页面超出范围时,CLR会将其标记,包括其事件处理程序,为垃圾收集做好准备。您无需在页面中取消注册事件处理程序。
当事件处理程序位于其他对象中而不是引发事件的对象时,情况会有所不同。在您给出的示例中,情况并非如此。
如果订阅另一个对象事件的对象首先超出范围,则必须取消订阅事件处理程序,否则当事件源超出范围时,它实际上只会被标记为垃圾回收。
如果引发事件的对象首先超出范围,则没有问题,因为订阅也将超出范围。