关于Dispose()
类MSDN的Component
方法here说 -
The Dispose method leaves the Component in an unusable state. After calling Dispose, you must release all references to the Component so the garbage collector can reclaim the memory that the Component was occupying.
现在让我们说,我有以下代码 -
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上调用release all references to the Component
之后我应该如何Dispose()
?我是否需要设置form2 = null;
或其他内容?请指教。先谢谢。
编辑:
你提到过 -
even if it were scoped to the method it would be free for garbage collection as soon as the method exits
在下列情况下,您能否告诉对象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
对象绝对不是垃圾回收。它仍在显示。
答案 0 :(得分:4)
嗯,是的,设置null
的唯一引用有效,但你的例子是人为的。在编写良好的代码中,您刚刚创建了函数本地的Form2
实例:
private void button1_Click(object sender, EventArgs e)
{
using (var form2 = new Form2())
{
// do something with form2
}
}
现在你没有什么可担心的,因为你保持对象的范围尽可能窄。
您不希望实时引用Dispose
d个对象,因为它可以让您在处置它们之后使用它们。我写了一些C#并且没有为此目的明确地将变量设置为null。您可以以更确定的方式管理对象生存期。
编辑:
根据您的编辑和问题:
方法ShowForm2退出,但form2对象绝对不是垃圾收集。它还在显示。
是的,在这种情况下,表单在关闭之前不能是GC(并且您也未能在其上调用Dispose()
。)这是因为GC"根"仍然存在于表单中,但在代码中不可见。
正确的说法是,当一个对象不再被应用程序使用时,它有资格使用GC。可以找到更深入的外观here。