表单关闭时不为null

时间:2018-12-17 10:57:43

标签: c#

我使用的是在需要时创建的表单单例:

    public PicForm dspForm;

    public PicForm getPicForm()
    {
        if (dspForm == null)
        {
            dspForm = new PicForm();
            dspForm.Visible = true;
        }
        dspForm.Show();
        return dspForm;
    }

当我关闭dspForm时,它不会设置为null。为什么?由于dspForm不为null,如何知道它已关闭?

4 个答案:

答案 0 :(得分:0)

PicForm在这里对您的变量一无所知。您必须将变量设置为null(例如,在FormClosed事件上)。

    public PicForm getPicForm()
    {
        if (dspForm == null)
        {
            dspForm = new PicForm();
            dspForm.FormClosed += PicForm_FormClosed;
            dspForm.Visible = true;
        }
        dspForm.Show();
        return dspForm;
    }

    private void PicForm_FormClosed(object sender, FormClosedEventArgs e)
    {
        PicForm picForm =(PicForm)sender;
        picForm.FormClosed += PicForm_FormClosed;
        dspForm = null;
    }

如果您不想使用其他事件,则可以检查是否处置了表单(将其关闭并用Show()方法显示)

    public PicForm getPicForm()
    {
        if (dspForm == null || dspForm.Disposing || dspForm.IsDisposed)
        {
            dspForm = new PicForm();
            dspForm.Visible = true;
        }
        dspForm.Show();
        return dspForm;
    }

使用此解决方案时,如果您在其他地方使用dspForm,则还需要检查它是否已处置。否则,您可以获得ObjectDisposedException

答案 1 :(得分:0)

使用dspForm.Close()关闭表单时,该对象未设置为null。如果要将对象设置为null,则必须明确地执行以下操作: dspForm = null;

答案 2 :(得分:0)

使用此代码:

ID.Text

答案 3 :(得分:0)

您不应仅因为对资源的引用是null就假定要关闭任何资源。实际上,具有空引用和已处置对象彼此之间没有任何事情。您甚至可以有两个引用相同的表单。您希望关闭表单后两个引用都为空吗?为什么在调用方法后为什么期望引用指向null

var m = new MyType();
m.DoSomething(); // why should this yield to m being null??

您应该感兴趣的是,如果您的表单已处置,它将释放所有非托管资源(例如文件句柄)。这就是Form实现IDisposable接口的原因。在表单上调用Close将自动调用Dispose,这将释放这些资源(除非您通过ShowDialog打开表单)。但是,依赖于表单为null并不能使它释放那些资源,从而导致内存泄漏。