C# 调用Dispose后释放对组件的所有引用
关于C# 调用Dispose后释放对组件的所有引用,c#,.net,winforms,garbage-collection,C#,.net,Winforms,Garbage Collection,关于组件的Dispose()方法类MSDN说—— Dispose方法使组件处于不可用状态。调用Dispose后,必须释放对组件的所有引用,以便垃圾收集器可以回收组件占用的内存。 现在让我们假设,我有以下代码- public partial class Form1 : Form { private Form2 form2; public Form1() { InitializeComponent(); form2 = new Form2();
组件的Dispose()
方法
类MSDN说——
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代码>还是什么?请告知。先谢谢你
编辑:
你提到-
即使它的作用域是该方法,只要该方法退出,它就可以免费进行垃圾收集
您能告诉我在下列情况下,对象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。您可以以更确定的方式管理对象生命周期
编辑:
根据您的编辑和问题:
ShowForm2方法退出,但form2对象肯定没有被垃圾收集。它还在放映
是的,在这种情况下,表单在关闭之前无法进行GC(并且您也无法对其调用Dispose()
),这是因为表单仍然存在GC“root”,尽管它在代码中不可见
正确的说法是,当应用程序不再使用某个对象时,该对象符合GC的条件。可以找到更深入的查看。hummm…这是有意义的,使用using
块。但是使用
块的只能确保当您离开该块时,form2的Dispose()将被调用,而没有其他调用。我的问题是关于第二部分,您如何发布对form2的引用?我的event hand方法可能不是到此为止。很抱歉,我得到了这个消息,form2对象的作用域是使用
块在中,而不是在整个EventHandler方法中。我的错。谢谢你的帮助。@NerotheZero:是的,没错,尽管它的作用域是该方法,但只要该方法退出,它就可以免费进行垃圾收集。很高兴提供帮助。请参阅编辑
部分。我添加了一个进一步的查询。谢谢。@NerotheZero:添加了一些信息。另一方面,当有人回答你的问题时,鼓励你将答案标记为已接受。