Form2 f = null;
using (f = new Form2()) {
f.Show();
}
string s = f.Text;//为什么没有被回收掉,为什么还能用为什么还能用为什么还能用觉得不可思议的可以试试

解决方案 »

  1.   

    你显示着怎么回收啊~~~CLOSE他
      

  2.   

    看清楚,using啊,你可以不用using,改dispose试试,效果一样
      

  3.   

    你说你一个EXCEL文档在打开的情况下能删除吗???如果能那么这个就是释放
      

  4.   

    不能,怎么了?FileStream对象dispose掉后你还能使用吗?我上面代码的意思是form执行dispose后,还能正常使用
      

  5.   

    Dispose是释放资源,又不是清理内存.你甚至可以反其道的在自定义类的Dispose方法中拼命的去创建对象.这种测试有什么意义?
      

  6.   

    那你给咱们在using块外Show一个看看.
      

  7.   

    要的就是你这个答案,既然懂的话就给解释下吧。
    dispose释放了非托管资源?那我问两个问题
    一.如上代码,为什么Dispose后大部分方法和属性都可以正常使用,Show确会异常;
    二.Form2 f = null;   using (f = new Form2()) {   }   string s = f.Text;//这跟上面代码不太一样,new后直接释放了,没有show,但是这里的f.Text却会报异常,这又是为什么呢?以上两问,望jointan不吝赐教,3Q
      

  8.   


     void MM() {
    Form2 f = null;
    using (f = new Form2()) {

    }
    string s = f.SS;
    }重贴下代码
      

  9.   

    using 是对应IDisposable接口的.对象的IDisposable接口,主要是释放资源,而不是释放内存,.Net中,对于存在引用的任何东西,都不会释放内存,这在自己的代码中没法控制.Show方法,是操纵资源的,Dispose也就释放是Handle和组件模型中的Container中的成员(Dispose会和Close互相调用),所以,如果某属性或方法,需要使用这两个中的内容时,会异常,但其他的成员变量,由于不属于Dispose方法释放的范围(实际上也没法释放,.Net根本没有这个功能),所以肯定还是能访问的.由于.Net的引用是依靠跟踪(计数,差不多也就是addref等原始方法)实现的,只要你可以测试(也就是你可以用代码访问),那么,你访问的变量,可能就是它的最后一个引用,由于存在这个引用,所以引用计数不可能为0,即使GC.Collect也没用,依然不会清理这块内存,也有不会有任何异常返回,而且值也是你原先设定的,所以,你没法测试对象销毁后,访问他会出现什么问题.事实上,用C说,在free后,只要在原内存上没发生malloc,这块内存也是可以正常访问的,只不过访问已经没有意义了,但不确定未来时间会重写这段内存,C中也不是free后,立即执行类似memset之类的函数.
      

  10.   

    这个确实没有意义,只是突然有人这么说了一下,给整蒙了,谢谢jointan