假设我有一个名为Dialog的类,它扩展了Form.对话框上有一个文本框和一个OK按钮,当用户单击OK时,通过事件返回文本框值:
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();
}
在一天中,用户可以将该对话框实例化数十次甚至数百次.
当作用域离开私有方法时,垃圾收集器是否会自动清除与对话框实例相关的所有内容,包括匿名侦听器的所有管道?
谢谢
最佳答案 活动的发布者保留对每个订阅者的强烈引用.如果发布者的寿命比订阅者长,那么订阅者将在发布者存在时固定在内存中.
在您的示例中,发布者仅存在于私有方法的范围内,因此对话框和处理程序将在方法返回后的某个时刻进行垃圾回收.
我建议遵守dot net framework guidelines for publishing an event,建议使用受保护的虚拟方法来调用事件.