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

◆请教高手,自定义类中变量值释放问题◆
我自定义了一个类MyTest,其中有个变量frm,如下
  
  class MyTest
  {
    public Form frm = null;
    .....
  }


然后我在代码中
 
    MyTest mt = new MyTest();
    form1 fm = new form1();
    mt.frm = fm;
    fm.ShowDialog(); //打开窗口
    if (mt.frm == null)
      MessageBox.Show("1");
    else
      MessageBox.Show("2"); //为何执行的是这句


现在我打开form1 后,再关闭form1,为何frm的值不为null?也就是frm的值并没有释放

------解决方案--------------------
form1虽然关闭了,但是fm还存在,只是你看不到那个form了,还可以重新ShowDialog

fm.Dispose()//这才是释放fm的所有资源
------解决方案--------------------
你要自己附值null
------解决方案--------------------
Form(从Control继承),它的实现有些特殊,一方面,它和一个普通的类一样,具有属性和各种字段,另一方面,它底层通过调用系统API实现显示和界面操作。因此,有一个叫Control.IsHandleCreated的属性,可以判断窗体是否和一个句柄关联,也就是说,和窗体(C#的一个普通对象)对应的那个窗体(一个实实在在的窗口,无论显示与否)是否存在。
------解决方案--------------------
用 fm.Dispose() 可以释放资源
但是资源释放后,也不表示 mt.frm == null,需要手动设置 mt.frm = null 才行
释放已经释放,需要通过 Form.IsDisposed 属性来判断。
------解决方案--------------------
frm不为null只是不活动了而已
------解决方案--------------------
引用:
现在我打开form1 后,再关闭form1,为何frm的值不为null?也就是frm的值并没有释放 

你说的那个“释放”不是释放的意思。

代码
if (mt.frm == null)
这只是检测属性frm是否没有引用对象,跟原来的对象是否“释放”并没有关系(原来的对象完全可以被其它变量引用,只不过不被属性frm所引用而已)。

------解决方案--------------------
窗体Close的时候,赋值null。