关于Dispose()类MSDN hereComponent方法说-

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;或其他内容?请指教。预先感谢。

编辑:

@Ed S.

您提到-

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对象绝对不会被垃圾回收。它仍在显示。

最佳答案

好吧,是的,将唯一引用设置为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

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

10-15 21:12