日期:2014-05-17  浏览次数:20987 次

this.Close()的疑惑

     //退出
        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()?

------解决方案--------------------
那你的lf应该是主窗体 主要主窗体没有关闭 程序仍然可以继续往下执行的 
你可以把 
 this.Close();  
 lf.Close();
顺序颠倒一下 变成
lf.Close();
this.Close(); 

这时侯 this.Close(); 应该就不能执行了 当然 前提是lf是主窗体
------解决方案--------------------
窗体和程序没有关系,窗体关闭了,这个窗体的方法一样能运行,
------解决方案--------------------
引用:
窗体和程序没有关系,窗体关闭了,这个窗体的方法一样能运行,


是的。只有return语句和丢出异常才可以“不会再往下执行了”。
------解决方案--------------------
引用:
我现在的理解是这两句代码是在同一个事件里的,虽然在事件里面关闭了窗体(无论是主窗体还是其他窗体)只要事件还没有执行完 该窗体的引用任然存在,只有等到事件结束时GC才会清理掉该窗体,但是我不能理解的是调试时明显进入了 dispose方法,为什么GC没有立即清理呢,还是GC.Collect() 和dispose 具体有什么关系?


谁跟你说的进入了 dispose 方法就是 GC “清理掉”对像啊?GC在清理之前,会去掉 Dispose 方法,因此一般来说用不着画蛇添足地去自己调用 Dispose 方法。但是反过来说,代码调用 Dispose 方法(例如Close方法间接调用了 Dispose 方法),并不会去强迫 GC 去“清理掉”当前对象。

有人说调用 Dispose 方法就是销毁当前对象,这是胡说八道了。我从来没有看到这个说法的出处。如果你听到这种说法,应该及时指出来一面谣言祸害更多人。 
------解决方案--------------------