gpt4 book ai didi

c# - 从 C# 和垃圾收集中的事件中分离匿名监听器

转载 作者:行者123 更新时间:2023-11-30 12:33:16 25 4
gpt4 key购买 nike

假设我有一个名为 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();
}

用户一天中可能会实例化此对话框数十次甚至数百次。

当范围离开私有(private)方法时,垃圾收集器是否会自动清理与对话实例相关的所有内容,包括匿名监听器的所有管道?

谢谢

最佳答案

事件的发布者保留对每个订阅者的强引用。如果发布者的生命周期比订阅者长,那么订阅者将在发布者存在时固定在内存中。

在您的示例中,发布者仅存在于您的私有(private)方法范围内,因此对话框和处理程序都将在方法返回后的某个时刻被垃圾回收。

我建议遵守 dot net framework guidelines for publishing an event ,这建议使用 protected 虚拟方法来调用事件。

关于c# - 从 C# 和垃圾收集中的事件中分离匿名监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591195/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com