//退出
        private void tsmiExit_Click(object sender, EventArgs e)
        {
           DialogResult result=MessageBox.Show("确定要退出吗","提示",MessageBoxButtons.OKCancel,MessageBoxIcon.Question);
           if (result==DialogResult.OK)
           {
               this.Close();
               lf.Close();
           }
        }其中lf 是我的第一个窗体,this是我的第二个窗体,如果按我的理解当执行到this.Close()时,此时当前窗体已经被关闭了,就不会再往下执行了,为什么我调试的时候程序执行到了lf.Close()?

解决方案 »

  1.   

    那你的lf应该是主窗体 主要主窗体没有关闭 程序仍然可以继续往下执行的 
    你可以把 
     this.Close();  
     lf.Close();
    顺序颠倒一下 变成
    lf.Close();
    this.Close(); 这时侯 this.Close(); 应该就不能执行了 当然 前提是lf是主窗体
      

  2.   

    我刚刚试过了,仍然执行了第二句,我现在的理解是这两句代码是在同一个事件里的,虽然在事件里面关闭了窗体(无论是主窗体还是其他窗体)只要事件还没有执行完 该窗体的引用任然存在,只有等到事件结束时GC才会清理掉该窗体,但是我不能理解的是调试时明显进入了 dispose方法,为什么GC没有立即清理呢,还是GC.Collect() 和dispose 具体有什么关系?
      

  3.   


    是的。只有return语句和丢出异常才可以“不会再往下执行了”。
      

  4.   


    谁跟你说的进入了 dispose 方法就是 GC “清理掉”对像啊?GC在清理之前,会去掉 Dispose 方法,因此一般来说用不着画蛇添足地去自己调用 Dispose 方法。但是反过来说,代码调用 Dispose 方法(例如Close方法间接调用了 Dispose 方法),并不会去强迫 GC 去“清理掉”当前对象。有人说调用 Dispose 方法就是销毁当前对象,这是胡说八道了。我从来没有看到这个说法的出处。如果你听到这种说法,应该及时指出来一面谣言祸害更多人。 
      

  5.   

    一面  -->  以免可能有些人学过一点c语言的 delete 语句,于是把这个 Dispose 方法给想歪了。这种用 c 语言语法来套用 .net 编程的死板学习方法,是有害的。
      

  6.   

    就拿我这个问题来说的话,之前我是这么理解的,如果从面向对象的角度来考虑的话,this是一个窗体对象,当我将这个窗体关闭后,这个对象就不存在了,而我的“退出”按钮仅仅是这个对象的一个行为,对象都不存在了,又何谈什么行为?
    当然了,唯一的解释就是当窗体关闭后,这个对象仍然存在,所以会继续执行this.Close()下面的代码。
    但是最近遇到一个单例模式,假设只有Form1、Form2两个窗体代码如下:
      

  7.   

    就拿我这个问题来说的话,之前我是这么理解的,如果从面向对象的角度来考虑的话,this是一个窗体对象,当我将这个窗体关闭后,这个对象就不存在了,而我的“退出”按钮仅仅是这个对象的一个行为,对象都不存在了,又何谈什么行为?
    当然了,唯一的解释就是当窗体关闭后,这个对象仍然存在,所以会继续执行this.Close()下面的代码。
    但是最近遇到一个单例模式,假设只有Form1、Form2两个窗体代码如下:你的理解根本就不对。
    Form2 f2 = new Form2();
    f2.Text = "hello"; //f2根本没有打开,那么它存在么?
    //f2.ShowDialog(); //不写这个,窗体永远不会显示。
      

  8.   


    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form2.GetInstance().Show();
            }
        }
    //以下是form2
     public partial class Form2 : Form
        {
            private Form2()
            {
                InitializeComponent();
            }
            private static Form2 uniquePlayer;
            public static Form2 GetInstance()
            {
                if (uniquePlayer == null)
                {
                    uniquePlayer = new Form2();
                }
                return uniquePlayer;
            }        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
            {
                //uniquePlayer = null;
            }
        }
    如果我没写uniquePlayer = null;这一句的话,那么当我第二次打开Form2的时候,就会提示无法访问已经释放的对象,当加上这句的时候,一切正常! 我现在有两种理解:1.当加上uniquePlayer = null;这句话时,uniquePlayer指向的对象已经被回收了 2.uniquePlayer原来指向的对象还没有被回收,只是uniquePlayer已经不再指向它了(因为uniquePlayer=null了)
      

  9.   

    嗯,这个我现在已经知道了,只要new过之后肯定存在,只是没有显示而已,而且Close()之后该窗体对象也不为空,你看我上面那个单例模式的例子,我Close()之后如果不指定uniquePlayer=null的话,下次再次打开的时候就会提示无法访问已经释放的对象,但是在我一楼的问题中,当执行到this.Close()的时候,该窗体已经释放了,但是它还是将该事件的代码都执行完毕了,所以说我的理解是当我们在类似单击事件这样的代码里先将该窗体关闭了,但如果下面还有代码的话,它是肯定会执行完所有代码的,当执行到"}"后,如果我们想要再次访问的话,就会出现"无妨访问已经释放的对象",
    呵呵~我是新手,如果有说的不对的地方,希望前辈们多多指点,本人将虚心接受……
      

  10.   

    this.close()只会激发,关闭窗口的动作。不代表他会中止当调用函数。如果你this.close()之后(如没有其它阻止代码)再调用this里的某些控件可能会出错