public bool TryAdd(TKey key, TValue value) { if (key == null) { throw new ArgumentNullException("key"); } var weakKey = new WeakKeyReference <TKey>(key, _comparer); var weakValue = WeakReference <TValue> .Create(value); _removeWeakReferencesInNull(); return(_dictionary.TryAdd(weakKey, weakValue)); }
public TValue GetOrAdd(TKey key, Func <object, TValue> valueFactory) { if (key == null) { throw new ArgumentNullException("key"); } WeakReference <TKey> weakKey = new WeakKeyReference <TKey>(key, _comparer); _removeWeakReferencesInNull(); var res = _dictionary.GetOrAdd(weakKey, mKey => WeakReference <TValue> .Create(valueFactory(mKey))); return(res.Target); }
public TValue GetOrAdd(TKey key, Func <object, TValue> valueFactory) { if (key is null) { throw new ArgumentNullException(nameof(key)); } var weakKey = new WeakKeyReference <TKey>(key, _comparer); _removeWeakReferencesInNull(); WeakReference <TValue> res; while (true) { res = _dictionary.GetOrAdd(weakKey, (mKey, eKey) => WeakReference <TValue> .Create(valueFactory(eKey)), key); if (res.IsAlive) { break; } _dictionary.TryRemove(weakKey, out _); } return(res.Target); }
public bool TryAdd(TKey key, TValue value) { if (key is null) { throw new ArgumentNullException(nameof(key)); } var weakKey = new WeakKeyReference <TKey>(key, _comparer); if (_dictionary.TryGetValue(weakKey, out var oValue)) { if (!oValue.IsAlive) { _dictionary.TryRemove(weakKey, out _); } else { return(false); } } var weakValue = WeakReference <TValue> .Create(value); _removeWeakReferencesInNull(); return(_dictionary.TryAdd(weakKey, weakValue)); }
protected override void SetValue(TKey key, TValue value) { var weakKey = new WeakKeyReference <TKey>(key, _comparer); _dictionary[weakKey] = WeakReference <TValue> .Create(value); }