c# - 调用 Dispose 后释放对该组件的所有引用

标签 c# .net winforms garbage-collection

关于 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; 还是什么?请指教。预先感谢。

编辑:

@Ed S.

你提到 -

即使它的范围仅限于该方法,一旦该方法退出,它也可以免费进行垃圾回收

您能否告诉我们在以下情况下对象 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
    }
}

现在您无需担心任何事情,因为您已将对象的范围保持得尽可能窄。

您不希望实时引用 Disposed 对象,因为这样您就可以在释放它们后使用它们。我编写了相当多的 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/

相关文章:

c# - 关于DI的问题以及如何解决一些问题

c# - 如何删除 wpf 中动态添加的控件

C# 泛型方法并返回在 xml 方法中创建的参数化类型的对象

c# - 以下语句中的 `this` 和 `base` 有什么区别?

c# - 将它们放在 WinForm 上时,是否可以让您的用户控件显示这些对齐指南?

.net - 编译后用户控件的文本在设计器中消失

c# - 在 GridView 中显示一对多关系中的单个值

c# - 集合和列表

.net - 这是 F# 结构化 printf 错误吗?

c# - 将一个窗口放在另一个窗口前面