原文:C#WeakReference弱引用
弱引用:在引用东西的同时,允许垃圾回收该东西。
.NET*给了WeakReference东西来实现这个成果。
对付那些创建自制但耗费大量内存的东西,即但愿连结该东西,又要在应用措施需要时使用,
同时但愿GC须要时回收时,可以考虑使用弱引用。弱引用使用起来很简单,
WeakReference w = new WeakReference(xml);//创建若引用东西
if (w.IsAlive)//判断是否已被垃圾回收
{
XmlDocument xml1 = w.Target as XmlDocument;//转换为指定的东西类型给你
}
WeakReference的结构函数有两个重载。
下面的这些话是引用别人的微博,因为自身不太理解,就不久不多述。
原文出自:
前面的文章中我提到过需要Finalize的东西在最终释放前会有一 次复生,我们概略可以猜到第二个参数暗示的意思了。如果我们第二个参数给false,这个弱引用就是一个short weak reference(短弱引用),当GC回收时,发明没有这个东西的引用了,就认为这个东西无用,这时短弱引用对这个东西的跟踪到此为止,弱引用的 Target被设置为null。前面的一个参数的结构函数版本新建的弱引用为短弱引用。如果第二个参数给true,这个弱引用就是一个long weak reference(长弱引用)。在东西的Finalize要领没有被执行以前,Target都可用。不过这是东西的某些成员变量也许已经被回收,所以使 用起来要想当小心。
此刻让我们看看WeakReference是如何实现的。很显然WeakReference不能直接的引用方针东西,WeakReference的 Target属性的get/set是两个函数,从某处查到方针东西的引用返回,而不是我们最常用写的那样直接返回或者设置一个私有变量。GC维护了两个列 表来跟踪两种弱引用的方针东西,在一个 WeakReference东西创建时,它在相应的列表中找到一个位置,将方针东西的引用放入,很显然,,这两个列表不是根的一部分。在GC进行内存回收的 时候,如果要回收某一个东西,会查抄弱引用的列表,如果生存着这个东西的引用,则将其设为null。