4

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

以供参考:

来自 MSDN 的回答:

要与对象建立弱引用,请使用要跟踪的对象的实例创建 WeakReference。然后将 Target 属性设置为该对象并将该对象设置为 null。有关代码示例,请参阅类库中的 WeakReference。

4

4 回答 4

12

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

MSDN > 弱参考

于 2008-12-06T22:17:07.370 回答
5

您可以在 .NET 中创建弱引用吗?

是的:

WeakReference r = new WeakReference(obj);

用途System.WeakReference.

于 2008-12-06T22:17:35.420 回答
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引用被视为强引用,并且在不再使用之前不会被收集。如果您想在范围之后保留引用,您可以将其设置为成员变量。

于 2008-12-06T22:18:20.067 回答
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名称空间中,因此无需为其包含任何特殊程序集。

于 2008-12-10T16:55:30.357 回答