我想在我的应用程序中保留某个类别的对象列表。但我仍希望该对象被垃圾回收。你能在.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
是使用person对象(p1)
作为构造函数中的参数设置为WeakReference
对象。
如果进行垃圾回收,或者出于测试目的自己调用它:
GC.Collect();
然后由 _weakRef
成员变量持有的 p1
目标对象应该被垃圾回收。您可以编写代码进行检查:
if (_weakRef.IsAlive)
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
命名空间中,因此无需包含任何特殊的程序集。
if (wr.IsAlive)
和 objA2 = wr.Target as ClassA;
之间对象被回收了怎么办? wr.Target
(因此 objA2
)会变成 null。 - Sebastian NegraszusIsAlive
属性适用于仅在引用死亡时才感兴趣的代码;这种代码可以检查 Target
是否为 null,但这可能会导致对象被无意中保持存活。 - supercat