.NET中的弱引用

4
有人能给出在.net项目中使用弱引用的一些示例吗?
5个回答

4
考虑使用两级缓存。因此,第一级中的对象使用普通引用进行引用,第二级中使用弱引用进行引用。因此,如果您想从第一级中过期您的对象,则可以将其放入第二级。
下次客户端尝试访问此对象时,如果您有足够的内存,则该对象将从第二级晋升,但是如果内存不足且对象已被收集,则必须重新创建对象。有时会重新创建或从昂贵的存储中检索它,但在某些情况下,您将能够在第二级中找到它。

3

一个场景是你想让一个对象具有单例行为,但你不希望它使用长期引用一直存在。例如:

class ExpensiveSingleton
{
   private static WeakReference _instanceWeakRef;
   private ExpensiveSingleton() { ... your expensive ctor ... }

   public static ExpensiveSingleton Instance
   {
      get
      {
         ExpensiveSingleton reference = null;

         if(_instanceWeakRef != null)
            reference = _instanceWeakRef.Target as ExpensiveSingleton; // Try a cheap access

         if(reference == null)
         {
             reference = new ExpensiveSingleton(...); // Pay the cost
             _instanceWeakRef = new WeakReference(newInstance);
         }

         return reference;       
      }
   }
}

为了简洁起见,这个并没有被做成线程安全的。

这确保了你获取到的所有指向该对象的强引用都是同一个对象,并且当所有强引用都消失后,该对象最终会被回收。


new WeakReference(newInstance) 应该改为 new WeakReference(reference) 吗? - si618
1
这适用于哪种类型的对象?如果创建该对象很昂贵,我预计使用弱引用可能会导致不良行为,如果应用程序重复请求引用,做一些小事情,然后放弃该引用。我只期望保持昂贵但不需要创建的对象是那些具有相当可变状态的对象,并且我预计在大多数情况下,无论是否有任何活动引用,这种状态都将保持有效。 - supercat

1

在 msdn 页面中 WeakReference 有一个很好的例子,这是一个实现缓存的样本代码。


1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接