有这样两个窗体:
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,这是什么原因?

解决方案 »

  1.   

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

  2.   

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

  3.   

    Form2   frm=new   Form2(); 
    你这句话已经声明了frm这个对象了,后面的什么事件方法多是操作frm里面的内容的只要你没把frm赋值为null,就一定能访问的啊!
      

  4.   

    可能是gc还未回收吧,楼主可以在另一个函数里访问frm对象看是否报错
      

  5.   

    frm这个对象还在,除非不在作用域,或被显示的给释放掉
      

  6.   


    就算frm还是指向这个对象的地址,这个对象已经不存在了,怎么还能访问呢?
      

  7.   


    怎么可能始终存在,都已经被dispose掉了嘛!
      

  8.   

    没有为空啊,你的frm的作用域还没过,引用还在,GC是不会回收的Close只不过是窗体类的一个方法而已。那个语句显示对象不存在了?
    不要被表象迷惑
      

  9.   

    对象一直都存在的,除非frm被置空,不然这段代码没有执行完之前这个对象一直都会存在,dispose是释放掉了所占用的资源。
      

  10.   

    在.net的 Form 类其实是两层,一层是Windows意义上的窗口,由Handle属性来标识,所有对这个窗口的操作都必须通过Windows API 来实现,比如关闭窗口, Form.Close() 中调调用 DistroyWindow(Handle);这时这个窗口确定关了,因为你已经看不到了.
    还有一层,就是.NET中的类,如Form类,Form类的一个对象并不等同于一个窗口,它的作用是来管理一个窗口的,可以理解为"窗口管理类",虽然窗口关了,但这个管理窗口的类还存在,它里面所有自定义的数据成员还存在,只有当frm = null;之后,.net才会释放该对象.
    (当然,如果只把frm=null而没有Close(),则窗口不对关闭,还能看得到).
      

  11.   

    close 知识不显示窗口,实际上着个对象还是存在的,
    窗口资源释放后,就不能访问了,这时对象就不存在了
      

  12.   

    close() 只是关系和释放其上面的资源,对本身的内存不释放,只有  frm = null后是真正意义的关闭 在内存中不存大些对象
      

  13.   

    谢谢楼上各位同学的解答,现总结如下:
    1、当通过ShowDialog方法来显示一个模态窗体时:调用该窗体的Close方法后,只是隐藏了该窗体,任然可以访问该窗体,并可以取得该窗体上控件的值,而且还可以通过ShowDialog方法重新显示该窗体。当调用该窗体的Dispose方法时,等于释放了该窗体所占有的资源,但该对象任然存在,可以访问该窗体,也可以取得窗体上控件的值,但是不能再通过ShowDialog方法重新显示该窗体。
    2、当通过Show方法来显示一个非模态窗体时,情况就简单许多,因为Close方法的Dispose方法是一样的,他们都调用了带一个参数的Dispose方法。