我读了雨痕“弱引用 WeakReference”一文。可是在一处“使用弱引用后,不应该再使用强引用,有关细节可以参考SDK帮助文档。”查了MSDN也没有找到为什么,请高人,说说或给出相关"SDK帮助文档"文章的地址。在线。好了立即给分。

解决方案 »

  1.   

    认真学习,才对吗,帮我顶吧,to ls
      

  2.   

    弱引用 WeakReference
    [ 2005-07-27 23:38:14 | 作者: yuhen ] 
    字号: 大 | 中 | 小 
    在程序设计中我们经常会进行一些全局缓存设计,诸如使用静态或者全局根字段来引用某个对象,以便一次创建多次使用。如:
      class BigData
      {
      }  class Program
      {
        static BigData cache;    public static BigData DataCache
        {
          get 
          {
            if (cache== null) cache= new BigData();
            return cache;
          }
        }
      }但是这样做在某些时候会存在一些弊端,如:
    1. 当dataCache并没有被频繁使用,甚至因为某些原因仅仅被使用了一次时会造成内存资源的浪费。
    2. 由于GC只能回收不可达对象,因此即便内存不足,GC也无法回收这些闲置资源。这时建议你使用 WeakReference 来重构你的程序,以便获得更好的系统性能。
    WeakReference :“弱引用”,即在引用对象的同时仍然允许对该对象进行垃圾回收。
    使用弱引用后,不应该再使用强引用,有关细节可以参考SDK帮助文档。*****这就是我说的地方  class BigData
      {
        ~BigData()
        {
          Console.WriteLine("Destory...");
        }    public void Test()
        {
          Console.WriteLine("Test");
        }
      }  class Program
      {
        static WeakReference cache = new WeakReference(null);    public static BigData DataCache
        {
          get 
          {
            BigData data = cache.Target as BigData;
            if (data == null)
            {
              data = new BigData();
              cache.Target = data;
            }        return data;
          }
        }    static void Main(string[] args) 
        { 
          DataCache.Test();
          DataCache.Test();      GC.Collect();
          DataCache.Test();
        } 
      }改进后的程序,我们依旧可以实现我们缓存的目的,而GC也可以在合时的时候释放cache占用的内存。
    .NET中的缓存功能多采用了类似的设计。
    当然并非要求所有的场合都适合使用弱引用。补充:弱引用分为"短弱引用(Short Week Reference)"和"长弱引用(Long Week Reference)",其区别是长弱引用在对象的Finalize方法被GC调用后依然追踪对象。基于安全考虑,不推荐使用长弱引用。因此建议使用
    WeakReference wr = new WeakReference(object);

    WeakReference wr = new WeakReference(object, false);
      

  3.   

    看《.NET框架程序设计》19章 19.5节弱引用 P485页WeakReference :“弱引用”,即在引用对象的同时仍然允许对该对象进行垃圾回收。创建一个对象的弱引用后,通常要将该对象的强引用设置为null,因为强引用存在,垃圾收集器都不会对该对象执行垃圾收集。就是说只要该对象还有强引用,弱引用就没意义了。
      

  4.   

    bigeyescat(大眼猫)终于,有人解开了我的疑惑,谢谢您了,也感谢每一位回贴的兄弟。结贴。
      

  5.   

    刚刚下了,《.NET框架程序设计》,好书,细读之,谢谢各位了。
      

  6.   

    书上的原文:“一旦我们创建了一个对象的弱引用,我们通常要把这个对象的强引用设为null.如果有任何该对象的强引用存在,垃圾收集器都不会对该对象执行垃圾收集。”