1

这是另一个关于从 .NET 中妥善处理对象的问题。在阅读了很多关于处置最佳实践(和人们的意见)的不同文章之后,我无法得到那个答案。我有 2 个表格,Form1 和 Form2。

表格1

void ShowFormButton_Click(object sender, eventargs e)
{
    Form2 form = new Form2();
    form.TextChanged += new eventhandler(form_TextChanged);
    form.Show(this);
}

表格2

void CloseFormButton_Click(object sender, eventargs e)
{
    Close();
}

在 Form2 中调用 Close() 时,Form2 应该有 is dispose() 方法调用,因为它是通过调用 is Show() 方法打开的,但是由于 Form1 已注册 TextChanged 事件或 Form2,这是否会阻止 Form2 被释放或生成GC处理的过程效率低吗?

提前致谢

4

1 回答 1

1
表格 2 表格 = 新表格 2();
form.TextChanged += new eventhandler(form_TextChanged);

这意味着,Form2 实例引用了 Form1 form_TextChanged 方法。当 Form2 关闭时,这不会阻止它被收集,因此在这种情况下,取消订阅不是强制性的。

假设 Form2 订阅了 Form1 事件。在这种情况下,当 Form2 关闭时,Form1 仍然有对 Form2 的活动引用,无法收集 Form2,造成内存泄漏。

因此,答案取决于订阅方向和事件源/订阅者生命周期。无论如何,如果有不清楚的地方,最好取消注册事件。

于 2011-09-14T05:25:24.800 回答