.net net中的弱引用

.net net中的弱引用,.net,weak-references,.net,Weak References,有人能给出一些在.net项目中使用弱引用的例子吗?在msdn页面中有一个很好的例子,这是一个实现缓存的示例代码 一些好文章: 使用它们的一大好处是订阅活动。也适用于对象缓存。考虑两级缓存。因此,第一层中的对象使用普通参照进行参照,第二层中的对象使用弱参照进行参照。因此,如果你想让你的物品从第一层过期,你可以把它放在第二层 下次,当客户端尝试访问此对象时(如果您有足够的内存),对象将从第二级升级,但如果内存不足且对象已被收集,则必须重新创建对象。有时会从昂贵的商店重新创建或检索,但在某些情况

有人能给出一些在.net项目中使用弱引用的例子吗?

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

一些好文章:


使用它们的一大好处是订阅活动。也适用于对象缓存。

考虑两级缓存。因此,第一层中的对象使用普通参照进行参照,第二层中的对象使用弱参照进行参照。因此,如果你想让你的物品从第一层过期,你可以把它放在第二层

下次,当客户端尝试访问此对象时(如果您有足够的内存),对象将从第二级升级,但如果内存不足且对象已被收集,则必须重新创建对象。有时会从昂贵的商店重新创建或检索,但在某些情况下,您可以在第二级找到它。


一种情况是,您希望对象具有单例行为,但又不希望它永远存在于一个长期引用中。例如:

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;       
      }
   }
}
(为简洁起见,这并不是线程安全的)


这样可以确保您获得的对该对象的所有强引用都是相同的对象,并且当所有强引用都消失时,最终将收集该对象

newweakreference(newInstance)
不应该是
newweakreference(reference)
对于什么类型的对象合适?如果创建对象的成本很高,我认为如果应用程序重复请求引用、做一些事情,然后放弃该引用,那么使用弱引用可能会导致不良行为。我希望持有但不创建的唯一昂贵对象是那些包含大量可变状态的对象,并且我希望在大多数情况下,无论是否存在任何活动引用,这种状态都将保持有效。