[英]Are there Weak References in .NET?
我想在我的應用程序中保留一類特定對象的列表。 但我仍然希望對象被垃圾收集。 你能在.NET中創建弱引用嗎?
以供參考:
從MSDN回答:
要使用對象建立弱引用,可以使用要跟蹤的對象的實例創建WeakReference。 然后,將Target屬性設置為該對象,並將該對象設置為null。 有關代碼示例,請參閱類庫中的WeakReference。
是的,有一個通用的弱引用類。
是...
這里有一個很好的例子:
在您的類中,您創建了兩個成員變量:
WeakReference _weakRef = null;
Person _strongRef = null;
您創建了兩個新的Person
對象(我剛剛為此示例創建的簡單對象,包含Name
屬性和一些參考跟蹤代碼)。 接下來,將成員變量設置為新創建的Person
對象實例。
_strongRef = p;
_weakRef = new WeakReference(p1);
區別在於你會注意到_strongRef
只是一個常規的正常引用,而_weakRef
被設置為一個WeakReference
對象,其中person對象(p1)
作為構造函數中的參數傳入。
如果要進行垃圾收集,或者只是為了測試目的,您自己調用它:
GC.Collect();
然后,應該對_weakRef
成員變量持有的p1
目標對象進行垃圾回收。 您可以編寫代碼來檢查:
if (_weakRef.IsAlive)
如果WeakReference
仍處於活動狀態,您可以使用以下代碼將WeakReference
轉換為強引用或普通引用:
Person p = _weakRef.Target as Person;
現在, p
引用被視為強引用,在不再使用之前不會被收集。 如果您想在范圍之后保留引用,可以將其設置為成員變量。
這是WeakReference
的完整(非線程安全)實現示例
ClassA objA = new ClassA();
WeakReference wr = new WeakReference(objA);
// do stuff
GC.Collect();
ClassA objA2;
if (wr.IsAlive)
objA2 = wr.Target as ClassA;
else
objA2 = new ClassA(); // create it directly if required
WeakReference
位於System
命名空間中,因此無需為其包含任何特殊程序集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.