做了个实验,我让frmTest只能运行一次实例,并且在上面放了个按钮,用于关闭,代码如下:
public partial class frmTest : Form
    {
        private static frmTest instance;
        private frmTest()
        {
            InitializeComponent();
        }        public static frmTest Instance()
        {
            if (instance == null)
            {
                instance = new frmTest();
            }
            return instance;
        }        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }然后在第二个窗体中调用上面的窗体:
public partial class frmCall : Form
{
        private void buttonCall_Click(object sender, EventArgs e)
        {
            frmTest frmtest = frmTest.Instance();
            frmtest.Show();
        }
}第一次调用没有问题,但是在关闭frmtest后,再一次点击buttonCall,也就是再一次调用frmtest,这时会出现一个异常:Cannot access a disposed object.按照大家的理解,button1的Click事件只是close了frmtest窗体,"this.close()只是关闭一些连接或少量资源,实例还是存在的",这句话是从以前的帖子中抄来的,既然如此,在上例中,我并没有dispose,而只是close了一下,为什么就会出现了"不能访问一个disposed对象"了呢?于是我将frmTest的代码修改了一下:
public partial class frmTest : Form
    {
        private static frmTest instance;
        private frmTest()
        {
            InitializeComponent();
        }        public static frmTest Instance()
        {
            if (instance == null || instance.IsDisposed)  //修改了这里
            {
                instance = new frmTest();
            }
            return instance;
        }        private void button1_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }异常是没有了,但我不知道对内存的占用有没有影响,请高手点评!

解决方案 »

  1.   

    无模式的 Close()会调用 dispose()模式的不会就你的代码而言,应该不用对内存有影响
      

  2.   

    ShowDialog()的是有模式的,Show()的是无模式的
      

  3.   

    静态实例和NEW实例有啥不同,大家说说
      

  4.   

    这是我自己写的,为什么再一次调用frmTest窗体后会出现异常,原因是什么
      

  5.   

    在 Close 以后,这个实例还在,只不过被标记成了dispose,等待下次启动垃圾收集的时候清除掉。如果你只想隐藏窗口,而不是真的销掉它的话,可以重载 FormClosing事件里面加类似的代码e.Cancel=true;
    this.Hide();