Re:New Features in C# 7.0
by ygra on Friday March 10, 2017 @08:54AM
(#13838546)
But Dictionary<TKey,TValue> isn't thread-safe anyway, unless not modified.
[ Parent
| on HN ]
Calling TryGetValue will either return a value or not. Calling ContainsKey, followed by an index read can lead to a race condition that means the value isn't there any more.
If I'm reading the source correctly you could still get the bucket index and before you return true and the value, have that value removed from the dictionary. There is no synchronization going on, so concurrent modifications are just as much a problem with TryGetValue as with other approaches. TryGetValue is not atomic either.
Ok, fair enough. My mistake. Glad I don't use the BCL collection types any more and stick to immutable maps, lists, and sets :)