关于对象回收问题 对于托管资源,因为是局部变量,应该在上一次调用结束后,GC启动一个线程把此对象标记为可回收的对象,其实是把引用复制到一个不可到达的托管的表(堆)里,GC启动另一个线程,会析构这个对象.所以第一次调用创建的对象有可能被析构掉了,有可能还没有析构掉. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果这个对象的所有引用都没了,就会回收了。ACLASS a=new ACLASS();b=a;a=null; //不会回收b=null; //回收了 我明白你说的,但是我上面那个方法里面第一次调用它的时候就有一个networkstream nst指向了new networkstream(...) ,当第二次调用的时候同样有个networkstream nst指向了新实例化的networkstream对象,.NET会不会把第一个nst和第二个nst看做是同一个,第二次调用的时候就把之前实例化的对象回收了,因为第一次实例化的那个已经没有被引用了。如果.NET把第一个nst和第二个nst看做不一样的,那么实例化的第一个对象就至少永远会有一个引用,意思就是它不会被回收了。 什么时候被GC回收是不确定的,作为开发人员你无法知道。即使你写了null,即使你强制调用了GC启动回收,你就能确保回收了?不能。正确编程通常跟是否回收毫无关系。这类 IDisposable 对象在设计时就考虑到关闭socket连接的问题,因此追求可靠的编程员会写为:using(networkstream nst=new networkstream(...)}{.......} 用不着你去费心考虑它何时回收问题,那跟正确使用 networkstream 没有关系。正确使用 networkstream 只需要了解它是一个 IDisposable 对象就够了。 楼上的正确,最好是USING,或是实现IDisposable.自已调用垃圾回收会浪费更多的资源。 using(networkstream nst=new networkstream()}{} 使用结束会自动调用dispose回收资源在.net中自动内存管理是有垃圾收集器来执行的,GC自动完成对托管堆的全权管理。的非托管资源主要有两种方式:Finalize方法和Dispose方法。对于非托管资源的清理,Finalize由GC自动调用,而Dispose由开发者强制执行调用。尽量避免使用Finalize方式来清理资源,必须实现时,也应一并实现Dispose方法。来提供显示的调用控制。Finalize和Dispose方法,只能清理非托管资源,释放内存的工作仍由GC负责。对象使用完毕应该立即释放其资源。最好显示调用Dispose方法来实现。 其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对象,作用域内的变量等。 而非托管资源是CLR不能控制或者管理的部分,这些资源有很多,比如文件流,数据库的连接,系统的窗口句柄,打印机资源等等这些资源一般情况下不存在于Heap(内存中用于存储对象实例的地方)中。 CLR的GC功能也只能释放托管资源 ,非托管资源要自己释放 【求助】C# WebBrowser stop 方法不起作用,怎么办啊?谢谢指教! webservice 接口 同步调用 网络延时如何处理?? c#用打包工具应用程序出来后是源文件还是什么? c#ftpwebrequest中怎样显示文件夹 我想用C#编写一个查询系统,请高手指点! c#中连接数据库的问题 光标显示问题 急! 谢谢! 小弟只会C,不会C++。请问可以不用学VC,直接学C#吗? c#水波纹效果控件问题 300分求解关于CDO的问题 messagebox是否存在这样一个bug? 五笔?
ACLASS a=new ACLASS();
b=a;
a=null; //不会回收
b=null; //回收了
我明白你说的,但是我上面那个方法里面第一次调用它的时候就有一个networkstream nst指向了new networkstream(...) ,当第二次调用的时候同样有个networkstream nst指向了新实例化的networkstream对象,.NET会不会把第一个nst和第二个nst看做是同一个,第二次调用的时候就把之前实例化的对象回收了,因为第一次实例化的那个已经没有被引用了。如果.NET把第一个nst和第二个nst看做不一样的,那么实例化的第一个对象就至少永远会有一个引用,意思就是它不会被回收了。
{
.......
} 用不着你去费心考虑它何时回收问题,那跟正确使用 networkstream 没有关系。正确使用 networkstream 只需要了解它是一个 IDisposable
对象就够了。
自已调用垃圾回收会浪费更多的资源。
{}
使用结束会自动调用dispose回收资源
在.net中自动内存管理是有垃圾收集器来执行的,GC自动完成对托管堆的全权管理。的非托管资源主要有两种方式:Finalize方法和Dispose方法。对于非托管资源的清理,Finalize由GC自动调用,而Dispose由开发者强制执行调用。
尽量避免使用Finalize方式来清理资源,必须实现时,也应一并实现Dispose方法。来提供显示的调用控制。
Finalize和Dispose方法,只能清理非托管资源,释放内存的工作仍由GC负责。
对象使用完毕应该立即释放其资源。最好显示调用Dispose方法来实现。
CLR的GC功能也只能释放托管资源 ,非托管资源要自己释放