天天看點

C#WeakReference弱引用

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

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

對于那些建立便宜但耗費大量記憶體的對象,即希望保持該對象,又要在應用程式需要時使用,

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

WeakReference w = new WeakReference(xml);//建立若引用對象

if (w.IsAlive)//判斷是否已被垃圾回收

{

XmlDocument xml1 = w.Target as XmlDocument;//轉換為指定的對象類型給你

}

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

C#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弱引用
C#WeakReference弱引用
C#WeakReference弱引用