Practical use of System.WeakReference

后端 未结 4 1399
鱼传尺愫
鱼传尺愫 2021-01-30 21:35

I understand what System.WeakReference does, but what I can\'t seem to grasp is a practical example of what it might be useful for. The class itself seems to me to be, well, a h

4条回答
  •  长发绾君心
    2021-01-30 21:47

    I use it to implement a cache where unused entries are automatically garbage collected:

    class Cache : IEnumerable>
    { Dictionary dict = new Dictionary();
    
       public TValue this[TKey key]
        { get {lock(dict){ return getInternal(key);}}
          set {lock(dict){ setInteral(key,value);}}     
        }
    
       void setInteral(TKey key, TValue val)
        { if (dict.ContainsKey(key)) dict[key].Target = val;
          else dict.Add(key,new WeakReference(val));
        } 
    
    
       public void Clear() { dict.Clear(); }
    
       /// Removes any dead weak references
       /// The number of cleaned-up weak references
       public int CleanUp()
        { List toRemove = new List(dict.Count);
          foreach(KeyValuePair kv in dict)
           { if (!kv.Value.IsAlive) toRemove.Add(kv.Key);
           }
    
          foreach (TKey k in toRemove) dict.Remove(k);
          return toRemove.Count;
        }
    
        public bool Contains(string key) 
         { lock (dict) { return containsInternal(key); }
         }
    
         bool containsInternal(TKey key)
          { return (dict.ContainsKey(key) && dict[key].IsAlive);
          }
    
         public bool Exists(Predicate match) 
          { if (match==null) throw new ArgumentNullException("match");
    
            lock (dict)
             { foreach (WeakReference weakref in dict.Values) 
                { if (   weakref.IsAlive 
                      && match((TValue) weakref.Target)) return true;
             }  
          }
    
           return false;
         }
    
        /* ... */
       }
    

提交回复
热议问题