我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。您可以在 .NET 中创建弱引用吗?
以供参考:
来自 MSDN 的回答:
要与对象建立弱引用,请使用要跟踪的对象的实例创建 WeakReference。然后将 Target 属性设置为该对象并将该对象设置为 null。有关代码示例,请参阅类库中的 WeakReference。
我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。您可以在 .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();
那么成员变量p1
持有的目标对象_weakRef
应该被垃圾回收。您可以编写代码来检查:
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
名称空间中,因此无需为其包含任何特殊程序集。