A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心动行动 中级黑马   /  2013-8-22 21:22  /  1420 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 心动行动 于 2013-8-26 11:59 编辑

现在有一个项目Form 里面有2个窗口,为了实现单例模式,在Form2里面声明了一个Form2类型的静态字段和一个创建Form2对象的方法,方法内判断字段是否为空,如果为空,则创建对象,否则继续使用之前创建的对象。
现在在Form1创建一个button在里面调用Fom2的静态方法产生一个Form2的对象,然后再调用Show()方法。
第一次点击该按钮的时候,确实只能弹出一个Form2,但是在关闭Form2之后(没有关闭Form1)再次点击button,则会异常,“无法访问已经释放的对象”
这是为什么?

QQ图片20130822212027.jpg (31.64 KB, 下载次数: 20)

QQ图片20130822212027.jpg

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

6 个回复

倒序浏览
把你的代码贴出来。这样看不出来问题

不过也能猜个大概。因为你关闭Form2的时候已经把Form2 Dispose()掉了
这个窗体内创建的所有资源关闭并且释放该窗体。
如果说你想实现,继续调用之前创建的Form2
建议你不要把他Close掉,只是单纯的Hide掉就好了
然后再要显示的时候Show()就行了。

个人观点。欢迎指正

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
1. 垃圾回收器可以确定运行垃圾回收的最佳时间,自动进行垃圾回收;
2. 圾回收的一个产物是:C#对象没有确定性毁坏;
3. 所以会出现子窗口对象已被销毁,但又不为null,故出现访问时产生“未处理 ObjectDisposedException”异常。
回复 使用道具 举报
许庭洲 发表于 2013-8-23 06:58
1. 垃圾回收器可以确定运行垃圾回收的最佳时间,自动进行垃圾回收;
2. 圾回收的一个产物是:C#对象没有确定 ...

原来是垃圾回收期在作怪?
回复 使用道具 举报
  1.         private static Form2 instance;
  2.         public static Form2 Instance
  3.         {
  4.             get
  5.             {
  6.                 if (instance == null || instance.IsDisposed)
  7.                 {
  8.                     instance = new Form2();
  9.                 }
  10.                 return instance;
  11.             }
  12.         }
复制代码
  1.         private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             Form2 f = Form2.Instance;
  4.             f.Show();
  5.         }
复制代码
instance是一个静态的字段,它是在访问后就一直存在内存中。
你的按钮单击后,对静态字段赋值了(一个Form2窗体实例),该字段的指向的Form2窗体对象的地址给变量f一份,f调用了show方法。当窗体f被关闭(instance指向的那个对象在内存中被销毁。)
当再次点击按钮,调用instance指向的对象,对象已经被销毁了而你没判断对象是否被释放了,此时就会报错。

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
pm324 发表于 2013-8-22 23:07
把你的代码贴出来。这样看不出来问题

不过也能猜个大概。因为你关闭Form2的时候已经把Form2 Dispose()掉了 ...

用户要是只想开一次?
我看不太明白(原谅我的愚钝)。。。还请详述{:soso_e101:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马