簡體   English   中英

.NET中是否存在弱引用?

[英]Are there Weak References in .NET?

我想在我的應用程序中保留一類特定對象的列表。 但我仍然希望對象被垃圾收集。 你能在.NET中創建弱引用嗎?

以供參考:

從MSDN回答:

要使用對象建立弱引用,可以使用要跟蹤的對象的實例創建WeakReference。 然后,將Target屬性設置為該對象,並將該對象設置為null。 有關代碼示例,請參閱類庫中的WeakReference。

是的,有一個通用的弱引用類。

MSDN>弱參考

你能在.NET中創建弱引用嗎?

是:

WeakReference r = new WeakReference(obj);

使用System.WeakReference

是...

這里有一個很好的例子:

http://web.archive.org/web/20080212232542/http://www.robherbst.com/blog/2006/08/21/c-weakreference-example/

在您的類中,您創建了兩個成員變量:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM