日期:2014-05-17  浏览次数:20589 次

探讨 Csharp 垃圾回收 与 手动清理效率?
抄了这几年代码,话说学而不思则罔,死而不学则殆。
最近在看别人代码,发现有这么一段

//清理对象。
name = null

name 这个对象在执行到最后的时候给赋值null了。
我记得如果说 
string name = "名字";
这样其实是初始了两个变量吧,一个是name,一个是存放"名字"的地方。
那这样写 name=null,如果说是释放了,岂不是就释放了一个地方么?
还有这样写name=null 会提高系统效率么?在Csharp中。在C++中必须要释放吧?
还请大侠来指点指点。谢谢! :)
Csharp GC 垃圾回收

------解决方案--------------------
看了LZ的表情,忘了LZ在问啥
------解决方案--------------------
其实差不多一样的效率,好像网上有人专门解释这个。就算赋值为null,也没有立刻释放内存,还是要等待垃圾回收线程去回收的。
------解决方案--------------------
name = null  这个哪是垃圾回收


估计人家只是代码需要暂时赋值为null  

楼主你想多了。
------解决方案--------------------
MS一般不建议 手动去执行垃圾回收的  这样如果代码写的不好回去破坏自己的垃圾回收机制

gc.collection好像这个来进行回收的把
可以放在析构函数里面
------解决方案--------------------
Net中,如果name只是string之类的托管类型,那样写并没什么意义
控制一旦超出局部变量的使用范围,会立即出栈被回收的
如果name是SqlConnection或者Win32中的非托管资源,直接name=null,不但不能提高效率,反而可能会导致内存泄漏。
必须Dispose等方式显示释放,垃圾回收器无法回收它们的。
------解决方案--------------------
引用:
MS一般不建议 手动去执行垃圾回收的  这样如果代码写的不好回去破坏自己的垃圾回收机制

gc.collection好像这个来进行回收的把
可以放在析构函数里面

MSDN上说了,Net中不推荐析构,写不好反而会影响效率。推荐的做法是实现IDispose接口来处理