假设我有一个名为 Dialog 的类,它扩展了 Form。对话框上有一个文本框和一个“确定”按钮,当用户单击“确定”时,文本框值将通过事件返回:
public class Dialog: Form
{
public delegate void onDialogValueReturned(object sender, DialogEventArgs e);
public event onDialogValueReturned DialogValueReturned;
.
.
.
OKButton.Click += (sender, evt) =>
{
DialogEventArgs e = new DialogEventArgs();
e.Value =myTextBox.Text;
DialogValueReturned(this, e);
this.Close();
};
在我的调用表单中,我在本地方法中实例化一个对话框:
private void Foo()
{
Dialog D = new Dialog("blah blah");
D.DialogValueReturned += (dialog, evt) =>
{
//do something with evt.Value
};
D.ShowDialog();
}
用户在一天中可能会实例化该对话框数十次甚至数百次。
当范围离开私有方法时,垃圾收集器是否会自动清理与对话框实例相关的所有内容,包括匿名侦听器的所有管道?
Thanks
事件的发布者保留对每个订阅者的强引用。如果发布者的生命周期比订阅者长,那么当发布者存在时,订阅者将被固定在内存中。
在您的示例中,发布者仅存在于您的私有方法的范围内,因此对话框和处理程序都将在方法返回后的某个时刻被垃圾收集。
我建议遵守用于发布事件的 dot net 框架指南 http://msdn.microsoft.com/en-us/library/w369ty8x.aspx,这建议使用受保护的虚拟方法来调用事件。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)