原地址:http://www.cnblogs.com/zhangronghua/archive/2008/03/24/1120479.html
当把一个对象引用分配给一个变量时,该变量就包含对对象的一个强引用(strong reference)。垃圾收集器不会收回强引用仍在使用的对象。只要当变量离开作用域,或者显示地给变量分配null时,强引用才被删除。
弱引用(weak reference)可以保持对对象的引用,同时允许垃圾收集器在它认为适当的垃圾收集时间释放对象,回收内存。假设有一个对象创建相对便宜,但需耗费大量的内存,如果希望保持这个对象,在应用程序需要使用它,但也希望能够告诉垃圾收集器,在必要时把内存收回。
那么.NET为什么要提供弱引用这个功能,这既增加了对象状态的复杂性,也加大了我们学习的难度,好象很不合算吗?其实弱引用还是很有用的,一般认为当满足下列条件时,我们就应该考虑使用弱引用:
- 对象稍后可能被使用,但不是很确定。(如果确定要使用,就应该用强引用)
- 如果需要,对象可以重新被构造出来(比如数据库构造)。
- 对象占相对比较大的内存(一般大于几KB以上)
好象上面所列的条件很理论很晦涩啊!其实在日常实践中,可以用一句话来概括:弱引用一般用来完成对象的缓存,以提高应用程序的性能。
既然使用弱引用有好处,并且我们又知道了应该在何时使用它,那到底应该如何使用引应用呢?说了这么多,怎么还不说弱引用的使用方法啊?别急,让我们来看一个例子:
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
-->
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/ContractedBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/ContractedSubBlock.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/b854634c0904529d4018c4c3336be836.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
怎么样,看了上面的例子,是不是发现弱引用的使用是很简单的一件事啊?其实WeakReference类提供了两个构造函数:
WeakReference(object target);
WeakReference(object target, bool trackResurrection);。
如果我们像上面的例子中那样使用第一个构造函数,那traceResurrection将会被置为默认值false。同样我们可以利用第二个构造函数将traceResurrection置为true。那这个参数究竟有什么用呢?其实当traceResurrection为true时,应用程序就可以在对象的Finalize()方法被调用后,但对象的内存还没有真正发生改变(即GC垃圾收集操作的堆碎片清理还没有清理到对象所使用的内存区域)的这段时间里继续访问对象。对于这种情况我们一般称之为“长弱引用”。对应的,当traceResurrection被置为false,我们称之为“短弱引用”。
最后说一句,虽然有时候长弱引用可以给我们带来一定的方便性,当我们最好避免使用它,因为长弱引用的维护十分困难。