.NET中是否存在弱引用?

时间:2008-12-06 22:13:49

标签: c# .net garbage-collection weak-references

我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。你能在.NET中创建弱引用吗?

供参考:

来自MSDN:

  

使用。建立弱引用   对象,您创建一个WeakReference   使用对象的实例   跟踪。然后设置目标   属性到该对象并设置   对象为null。对于代码示例,   在课堂上看到WeakReference   库。

4 个答案:

答案 0 :(得分:12)

是的,有一个通用的弱引用类。

MSDN > Weak Reference

答案 1 :(得分:5)

  

你能在.NET中创建弱引用吗?

是:

WeakReference r = new WeakReference(obj);

使用System.WeakReference

答案 2 :(得分:3)

是......

这里有一个很好的例子:

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();

然后,p1成员变量所持有的_weakRef目标对象应该被垃圾收集。您可以编写代码来检查:

if (_weakRef.IsAlive)

如果WeakReference仍然有效,您可以使用以下代码将WeakReference转换为强引用或普通引用:

Person p = _weakRef.Target as Person;

现在p引用被视为强引用,在不再使用之前不会被收集。如果您想在范围之后保留引用,可以将其设置为成员变量。

答案 3 :(得分:0)

以下是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命名空间中,因此无需为其包含任何特殊程序集。