为什么窗体关闭之后还可以访问?

BeliEF 2012-04-23 12:42:57
有这样两个窗体:
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,这是什么原因?
...全文
342 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
laichunlin 2012-04-23
  • 打赏
  • 举报
回复
Form2 frm=new Form2();
你这句话已经声明了frm这个对象了,后面的什么事件方法多是操作frm里面的内容的

只要你没把frm赋值为null,就一定能访问的啊!
salmonl 2012-04-23
  • 打赏
  • 举报
回复
不是真正意义上的关闭
然鸟 2012-04-23
  • 打赏
  • 举报
回复
楼上说的有道理,frm这个对象在内存中始终存在,除非置空
dalmeeme 2012-04-23
  • 打赏
  • 举报
回复
本来就可以嘛。Close或Dispose掉,又没有给这个frm设为null,当然是可以访问的。
BeliEF 2012-04-23
  • 打赏
  • 举报
回复
谢谢楼上各位同学的解答,现总结如下:
1、当通过ShowDialog方法来显示一个模态窗体时:调用该窗体的Close方法后,只是隐藏了该窗体,任然可以访问该窗体,并可以取得该窗体上控件的值,而且还可以通过ShowDialog方法重新显示该窗体。当调用该窗体的Dispose方法时,等于释放了该窗体所占有的资源,但该对象任然存在,可以访问该窗体,也可以取得窗体上控件的值,但是不能再通过ShowDialog方法重新显示该窗体。
2、当通过Show方法来显示一个非模态窗体时,情况就简单许多,因为Close方法的Dispose方法是一样的,他们都调用了带一个参数的Dispose方法。
风雪猛狼 2012-04-23
  • 打赏
  • 举报
回复
close() 只是关系和释放其上面的资源,对本身的内存不释放,只有 frm = null后是真正意义的关闭 在内存中不存大些对象
zkcary 2012-04-23
  • 打赏
  • 举报
回复
close 知识不显示窗口,实际上着个对象还是存在的,
窗口资源释放后,就不能访问了,这时对象就不存在了
@信心 2012-04-23
  • 打赏
  • 举报
回复
楼上说有道理!
lixiao_445 2012-04-23
  • 打赏
  • 举报
回复
在.net的 Form 类其实是两层,一层是Windows意义上的窗口,由Handle属性来标识,所有对这个窗口的操作都必须通过Windows API 来实现,比如关闭窗口, Form.Close() 中调调用 DistroyWindow(Handle);这时这个窗口确定关了,因为你已经看不到了.
还有一层,就是.NET中的类,如Form类,Form类的一个对象并不等同于一个窗口,它的作用是来管理一个窗口的,可以理解为"窗口管理类",虽然窗口关了,但这个管理窗口的类还存在,它里面所有自定义的数据成员还存在,只有当frm = null;之后,.net才会释放该对象.
(当然,如果只把frm=null而没有Close(),则窗口不对关闭,还能看得到).
W80566889 2012-04-23
  • 打赏
  • 举报
回复
对象一直都存在的,除非frm被置空,不然这段代码没有执行完之前这个对象一直都会存在,dispose是释放掉了所占用的资源。
assky124 2012-04-23
  • 打赏
  • 举报
回复
没有为空啊,你的frm的作用域还没过,引用还在,GC是不会回收的

Close只不过是窗体类的一个方法而已。那个语句显示对象不存在了?
不要被表象迷惑
BeliEF 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

楼上说的有道理,frm这个对象在内存中始终存在,除非置空
[/Quote]

怎么可能始终存在,都已经被dispose掉了嘛!
BeliEF 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

本来就可以嘛。Close或Dispose掉,又没有给这个frm设为null,当然是可以访问的。
[/Quote]

就算frm还是指向这个对象的地址,这个对象已经不存在了,怎么还能访问呢?
hjd2357 2012-04-23
  • 打赏
  • 举报
回复
frm这个对象还在,除非不在作用域,或被显示的给释放掉
dd_zhouqian 2012-04-23
  • 打赏
  • 举报
回复
可能是gc还未回收吧,楼主可以在另一个函数里访问frm对象看是否报错
orochiheart 2012-04-23
  • 打赏
  • 举报
回复
想彻底消失就 frm=null;
郑沐洋 2012-04-23
  • 打赏
  • 举报
回复
有道理啊[Quote=引用 1 楼 的回复:]
本来就可以嘛。Close或Dispose掉,又没有给这个frm设为null,当然是可以访问的。
[/Quote]
mizuho_2006 2012-04-23
  • 打赏
  • 举报
回复
只是界面上看不到了而已。

我以前就在窗体关闭后写一些处理代码,把任务管理器中没关闭的该程序进程都杀掉。

111,076

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧