gpt4 book ai didi

c# - 调用 Dispose 后释放对组件的所有引用

转载 作者:太空宇宙 更新时间:2023-11-03 21:33:48 24 4
gpt4 key购买 nike

关于 Component 类的 Dispose() 方法 MSDN here说——

Dispose 方法使组件处于不可用状态。调用 Dispose 后,您必须释放对该组件的所有引用,以便垃圾收集器可以回收该组件占用的内存。

现在让我们说,我有以下代码 -

public partial class Form1 : Form
{
private Form2 form2;
public Form1()
{
InitializeComponent();
form2 = new Form2();
}

private void button1_Click(object sender, EventArgs e)
{
form2.Show();

//do something with form2

form2.Dispose();

??? ??? ???
//form2 = null;
}
}

假设,form2 包含一些我需要立即释放的非托管资源,当然,我希望 form2 能够被正确地进行垃圾回收。那么,在 form2 上调用 Dispose() 之后,我应该如何释放对组件的所有引用?我需要设置 form2 = null; 还是什么?请指教。预先感谢。

编辑:

@Ed S.

你提到 -

即使它在方法范围内,只要方法退出,它就可以免费进行垃圾回收

在下面的例子中,你能告诉对象 form2 到底发生了什么吗?

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
this.ShowForm2();
}

private void ShowForm2()
{
Form2 form2 = new Form2();
form2.Show();
}
}

ShowForm2 方法退出,但 form2 对象绝对没有被垃圾回收。它仍在显示。

最佳答案

嗯,是的,将唯一引用设置为 null 是可行的,但是您的示例是人为设计的。在编写良好的代码中,您将刚刚创建一个函数本地的 Form2 实例:

private void button1_Click(object sender, EventArgs e)
{
using (var form2 = new Form2())
{
// do something with form2
}
}

现在您无需担心任何事情,因为您已将对象的范围保持得尽可能窄。

您不希望对 Dispose 对象进行实时引用,因为这会让您在处理对象后继续使用它们。我写了一些 C#,并且从来没有为此明确地将变量设置为 null。您可以以更确定的方式管理对象生命周期。

编辑:

根据您的修改和问题:

The method ShowForm2 exits, but the form2 object is definitely not being garbage-collected. It's still showing.

是的,在这种情况下,表单在关闭之前无法进行 GC(并且您也无法对其调用 Dispose()。)这是因为 GC“root”该表单仍然存在,但它在您的代码中不可见。

正确的说法是,当一个对象不再被应用程序使用时,它就有资格进行 GC。可以找到更深入的了解 here .

关于c# - 调用 Dispose 后释放对组件的所有引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22886345/

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