我使用的是在需要时创建的表单单例:
public PicForm dspForm;
public PicForm getPicForm()
{
if (dspForm == null)
{
dspForm = new PicForm();
dspForm.Visible = true;
}
dspForm.Show();
return dspForm;
}
当我关闭dspForm
时,它不会设置为null。为什么?由于dspForm
不为null,如何知道它已关闭?
答案 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并不能使它释放那些资源,从而导致内存泄漏。