我想在我的应用程序中保留某类对象的列表。但我仍然希望对象被垃圾收集。你能在.NET中创建弱引用吗?
供参考:
来自MSDN:
使用。建立弱引用 对象,您创建一个WeakReference 使用对象的实例 跟踪。然后设置目标 属性到该对象并设置 对象为null。对于代码示例, 在课堂上看到WeakReference 库。
答案 0 :(得分:12)
是的,有一个通用的弱引用类。
答案 1 :(得分:5)
答案 2 :(得分:3)
是......
这里有一个很好的例子:
在您的班级中,您创建了两个成员变量:
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
命名空间中,因此无需为其包含任何特殊程序集。