Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用Dispose后释放对组件的所有引用_C#_.net_Winforms_Garbage Collection - Fatal编程技术网

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:添加了一些信息。另一方面,当有人回答你的问题时,鼓励你将答案标记为已接受。