日期:2014-05-18  浏览次数:20863 次

为什么窗体关闭之后还可以访问?
有这样两个窗体:
class   Form1()
{
   
}

class   Form2()
{
          public   string   name;
}

其中窗体1中有一个按钮,给按钮注册如下事件:
Form2   frm=new   Form2();
if(frm.ShowDialog()   ==   DialogResult.OK)
{
            MessageBox.Show(frm.name);
}

问题来了,当给frm的DialogResult赋值为DialogResult.OK后,frm自动关闭,但是既然还可以访问到这个frm,这是什么原因?

我开始以为是因为这个窗口并没有关闭,只是隐藏起来了,可是当我通过close或者dispose来关闭这个frm时(这时只要把if判断语句改成frm.ShowDialog()   ==   DialogResult.Cancel)就行了),仍然可以访问到这个frm,这是什么原因?

------解决方案--------------------
本来就可以嘛。Close或Dispose掉,又没有给这个frm设为null,当然是可以访问的。
------解决方案--------------------
楼上说的有道理,frm这个对象在内存中始终存在,除非置空
------解决方案--------------------
不是真正意义上的关闭
------解决方案--------------------
Form2 frm=new Form2(); 
你这句话已经声明了frm这个对象了,后面的什么事件方法多是操作frm里面的内容的

只要你没把frm赋值为null,就一定能访问的啊!
------解决方案--------------------
只是界面上看不到了而已。

我以前就在窗体关闭后写一些处理代码,把任务管理器中没关闭的该程序进程都杀掉。
------解决方案--------------------
有道理啊
探讨
本来就可以嘛。Close或Dispose掉,又没有给这个frm设为null,当然是可以访问的。

------解决方案--------------------
想彻底消失就 frm=null;
------解决方案--------------------
可能是gc还未回收吧,楼主可以在另一个函数里访问frm对象看是否报错
------解决方案--------------------
frm这个对象还在,除非不在作用域,或被显示的给释放掉
------解决方案--------------------
没有为空啊,你的frm的作用域还没过,引用还在,GC是不会回收的

Close只不过是窗体类的一个方法而已。那个语句显示对象不存在了?
不要被表象迷惑
------解决方案--------------------
对象一直都存在的,除非frm被置空,不然这段代码没有执行完之前这个对象一直都会存在,dispose是释放掉了所占用的资源。
------解决方案--------------------
在.net的 Form 类其实是两层,一层是Windows意义上的窗口,由Handle属性来标识,所有对这个窗口的操作都必须通过Windows API 来实现,比如关闭窗口, Form.Close() 中调调用 DistroyWindow(Handle);这时这个窗口确定关了,因为你已经看不到了.
还有一层,就是.NET中的类,如Form类,Form类的一个对象并不等同于一个窗口,它的作用是来管理一个窗口的,可以理解为"窗口管理类",虽然窗口关了,但这个管理窗口的类还存在,它里面所有自定义的数据成员还存在,只有当frm = null;之后,.net才会释放该对象.
(当然,如果只把frm=null而没有Close(),则窗口不对关闭,还能看得到).
------解决方案--------------------
楼上说有道理!
------解决方案--------------------
close 知识不显示窗口,实际上着个对象还是存在的,
窗口资源释放后,就不能访问了,这时对象就不存在了
------解决方案--------------------
close() 只是关系和释放其上面的资源,对本身的内存不释放,只有 frm = null后是真正意义的关闭 在内存中不存大些对象