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

一个singleton模式的设计,请教,在线等
我有一个窗体,内部有一个全局变量A,也是一窗体。我希望这个A被关闭后可以重新打开,类似:

if(a == null)
  a = new a();。。。。。

A出现了一次,然后被用户关闭,然后等到这个代码执行以后,a.show()不出来,界面看不到窗体。

我想知道是什么原因,怎么解决?

我不想重写a的关闭事件让它隐藏。

------解决方案--------------------
我以前碰到过这个问题。原因如下:
你把a第一次关闭的时候,实际上是执行的是a.Dispose()操作,就是a在堆栈中的资源被释放掉了,但是此时a在栈中仍有一个引用指向这个被销毁的内存,也就是说:a!=null,所以当你再次打开的时候,if(a == null) 这句是不会执行的。

换句话说,托管资源的=null释放和dispose释放是不同的,前者是垃圾回收器GC回收的,而后者是手动释放。你窗体关闭的操作属于dispose,但是此后却无法保证a是null,因为a仍然指向那个报废的内存。

解决方法,
方法1:在你要关闭的窗体的closing事件里面,加一句:a=null;确保a不指向那个报废的内存
方法2:不要用if(a == null)来判断,改称if(a.isDispose),这样也能保证正确

你可以看一下我这里的一片文章
http://blog.csdn.net/suinon/archive/2008/06/20/2569279.aspx