首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

this.Close()的不解

2013-08-29 
this.Close()的疑惑//退出private void tsmiExit_Click(object sender, EventArgs e){DialogResult result

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


一面  -->  以免

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

引用:
Quote: 引用:

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

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



你的理解根本就不对。
Form2 f2 = new Form2();
f2.Text = "hello"; //f2根本没有打开,那么它存在么?
//f2.ShowDialog(); //不写这个,窗体永远不会显示。
[解决办法]
this.close()只会激发,关闭窗口的动作。不代表他会中止当调用函数。如果你this.close()之后(如没有其它阻止代码)再调用this里的某些控件可能会出错

热点排行