1. 程式人生 > >C#WeakReference弱引用

C#WeakReference弱引用

實現 是我 kref 使用 應用 log ren 找到 span

弱引用:在引用對象的同時,允許垃圾回收該對象。

.NET中提供了WeakReference對象來實現這個功能

對於那些創建便宜但耗費大量內存的對象,即希望保持該對象,又要在應用程序需要時使用,

同時希望GC必要時回收時,可以考慮使用弱引用。弱引用使用起來很簡單,

WeakReference w = new WeakReference(xml);//創建若引用對象
if (w.IsAlive)//判斷是否已被垃圾回收
{
XmlDocument xml1 = w.Target as XmlDocument;//轉換為指定的對象類型給你

}

WeakReference的構造函數有兩個重載。

技術分享

下面的這些話是引用別人的微博,因為自身不太理解,就不多述。

原文出自:http://www.cnblogs.com/jeekun/archive/2011/10/09/2203712.html

前面的文章中我提到過需要Finalize的對象在最終釋放前會有一 次復活,我們大概可以猜到第二個參數表示的意思了。如果我們第二個參數給false,這個弱引用就是一個short weak reference(短弱引用),當GC回收時,發現沒有這個對象的引用了,就認為這個對象無用,這時短弱引用對這個對象的跟蹤到此為止,弱引用的 Target被設置為null。前面的一個參數的構造函數版本新建的弱引用為短弱引用。如果第二個參數給true,這個弱引用就是一個long weak reference(長弱引用)。在對象的Finalize方法沒有被執行以前,Target都可用。不過這是對象的某些成員變量也許已經被回收,所以使 用起來要想當小心。
現在讓我們看看WeakReference是如何實現的。很顯然WeakReference不能直接的引用目標對象,WeakReference的 Target屬性的get/set是兩個函數,從某處查到目標對象的引用返回,而不是我們最常用寫的那樣直接返回或者設置一個私有變量。GC維護了兩個列 表來跟蹤兩種弱引用的目標對象,在一個 WeakReference對象創建時,它在相應的列表中找到一個位置,將目標對象的引用放入,很顯然,這兩個列表不是根的一部分。在GC進行內存回收的 時候,如果要回收某一個對象,會檢查弱引用的列表,如果保存著這個對象的引用,則將其設為null。

技術分享

技術分享技術分享

C#WeakReference弱引用