public override bool Equals(object obj) { if (this == obj) { return(true); } WeakRefWrapper that = obj as WeakRefWrapper; if (that == null) { return(false); } object target = Target; if (target == null) { // If the reference is dead, we are only equal to ourselves, // and this was checked above. return(false); } return(hashCode == that.hashCode && Equals(target, that.Target)); }
public object this[object key] { get { return(WeakRefWrapper.Unwrap(innerHashtable[WeakRefWrapper.Wrap(key)])); } set { Scavenge(); innerHashtable[WeakRefWrapper.Wrap(key)] = WeakRefWrapper.Wrap(value); } }
public void WeakReferenceGetsFreedButHashCodeRemainsConstant() { object obj = new object(); WeakRefWrapper wr = new WeakRefWrapper(obj); int hashCode = wr.GetHashCode(); obj = null; GC.Collect(); Assert.IsFalse(wr.IsAlive); Assert.IsNull(wr.Target); Assert.AreEqual(hashCode, wr.GetHashCode()); }
public void Scavenge() { ArrayList deadKeys = new ArrayList(); foreach (DictionaryEntry de in innerHashtable) { WeakRefWrapper key = ( WeakRefWrapper )de.Key; WeakRefWrapper value = ( WeakRefWrapper )de.Value; if (!key.IsAlive || !value.IsAlive) { deadKeys.Add(key); } } foreach (object key in deadKeys) { innerHashtable.Remove(key); } }
public bool MoveNext() { // Skip any garbage-collected key/value pairs while (true) { currentKey = null; currentValue = null; if (!innerEnumerator.MoveNext()) { return(false); } currentKey = WeakRefWrapper.Unwrap(innerEnumerator.Key); currentValue = WeakRefWrapper.Unwrap(innerEnumerator.Value); if (currentKey != null && currentValue != null) { break; } } return(true); }
public void Remove(object key) { innerHashtable.Remove(WeakRefWrapper.Wrap(key)); }
public void Add(object key, object value) { Scavenge(); innerHashtable.Add(WeakRefWrapper.Wrap(key), WeakRefWrapper.Wrap(value)); }
public bool Contains(object key) { return(innerHashtable.Contains(WeakRefWrapper.Wrap(key))); }