关于 Component
类的 Dispose()
方法 MSDN here说 -
Dispose 方法使组件处于不可用状态。调用Dispose后,必须释放对该Component的所有引用,以便垃圾收集器可以回收该Component占用的内存。
现在假设我有以下代码 -
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;
还是什么?请指教。预先感谢。
编辑:
你提到 -
即使它的范围仅限于该方法,一旦该方法退出,它也可以免费进行垃圾回收
您能否告诉我们在以下情况下对象 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
d 对象,因为这样您就可以在释放它们后使用它们。我编写了相当多的 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/