对于托管资源,因为是局部变量,应该在上一次调用结束后,GC启动一个线程把此对象标记为可回收的对象,其实是把引用复制到一个不可到达的托管的表(堆)里,GC启动另一个线程,会析构这个对象.
所以第一次调用创建的对象有可能被析构掉了,有可能还没有析构掉.

解决方案 »

  1.   

    如果这个对象的所有引用都没了,就会回收了。
    ACLASS a=new ACLASS();
    b=a;
    a=null;   //不会回收
    b=null;    //回收了
      

  2.   


    我明白你说的,但是我上面那个方法里面第一次调用它的时候就有一个networkstream nst指向了new networkstream(...) ,当第二次调用的时候同样有个networkstream nst指向了新实例化的networkstream对象,.NET会不会把第一个nst和第二个nst看做是同一个,第二次调用的时候就把之前实例化的对象回收了,因为第一次实例化的那个已经没有被引用了。如果.NET把第一个nst和第二个nst看做不一样的,那么实例化的第一个对象就至少永远会有一个引用,意思就是它不会被回收了。
      

  3.   

    什么时候被GC回收是不确定的,作为开发人员你无法知道。即使你写了null,即使你强制调用了GC启动回收,你就能确保回收了?不能。正确编程通常跟是否回收毫无关系。这类 IDisposable 对象在设计时就考虑到关闭socket连接的问题,因此追求可靠的编程员会写为:using(networkstream nst=new networkstream(...)}
    {
    .......
    } 用不着你去费心考虑它何时回收问题,那跟正确使用 networkstream 没有关系。正确使用 networkstream 只需要了解它是一个 IDisposable
     对象就够了。
      

  4.   

    楼上的正确,最好是USING,或是实现IDisposable.
    自已调用垃圾回收会浪费更多的资源。
      

  5.   

    using(networkstream nst=new networkstream()}
    {} 
    使用结束会自动调用dispose回收资源
    在.net中自动内存管理是有垃圾收集器来执行的,GC自动完成对托管堆的全权管理。的非托管资源主要有两种方式:Finalize方法和Dispose方法。对于非托管资源的清理,Finalize由GC自动调用,而Dispose由开发者强制执行调用。
    尽量避免使用Finalize方式来清理资源,必须实现时,也应一并实现Dispose方法。来提供显示的调用控制。
    Finalize和Dispose方法,只能清理非托管资源,释放内存的工作仍由GC负责。
    对象使用完毕应该立即释放其资源。最好显示调用Dispose方法来实现。
      

  6.   

    其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。 而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。 
    CLR的GC功能也只能释放托管资源 ,非托管资源要自己释放