In C#, what is the key difference (in terms of features or use cases) between these two containers? There doesn't appear to be any information comparing these on Google.
System.Collections.ObjectModel.ReadOnlyDictionary System.Collections.Immutable.ImmutableDictionary
I understand that an ImmutableDictionary
is thread-safe. Is the same true of a ReadOnlyDictionary
?
This is not a duplicate of How to properly use IReadOnlyDictionary?. That question is about how to use IReadOnlyDictionary. This question is about the difference between the two (which, as someone commented on that thread back in 2015, would be a different question - ie. this one)
ReadOnlyDictionary
can be initialized once via constructor, then you can't add or remove items from it (they throw NotSupportedException
s). It's useful if you want to ensure that it won't be modified while it's sent across multiple layers of your application.ImmutableDictionary
has methods to modify it like Add
or Remove
, but they will create a new dictionary and return that, the original one remains unchanged and the copy of the new immutable dictionary is returned.Note that:
ReadOnlyDictionary
by passing another dictionary instance to the constructor. That explains why a ReadOnlyDictionary
is mutable (if the underlying dictionary is modified). It's just a wrapper that is protected from direct changes.ImmutableDictionary
: How can I create a new instance of ImmutableDictionary?That also explains why the ReadOnlyDictionary
is not thread-safe (better: it's as thread-safe as the underlying dictionary). The ImmutableDictionary
is thread-safe because you can't modify the original instance (neither directly nor indirectly). All methods that "modify" it actually return a new instance.
But if you need a thread-safe dictionary and it's not necessary that it's immutable, use a ConcurrentDictionary
instead.