標籤:跟蹤 需要 成員 程式 png final archive nal 微博
弱引用:在引用對象的同時,允許記憶體回收該對象。
.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弱引用