En C #, quelle est la principale différence (en termes de fonctionnalités ou de cas d'utilisation) entre ces deux conteneurs? Il ne semble pas y avoir d'informations les comparant sur Google.
System.Collections.ObjectModel.ReadOnlyDictionarySystem.Collections.Immutable.ImmutableDictionary
Je comprends qu'un ImmutableDictionary est thread-safe. Est-ce la même chose pour un ReadOnlyDictionary?
ReadOnlyDictionary
peut être initialisé une fois via le constructeur, alors vous ne pouvez pas y ajouter ou supprimer des éléments (ils jettent NotSupportedException
s). C'est utile si vous voulez vous assurer qu'il ne sera pas modifié pendant qu'il est envoyé sur plusieurs couches de votre application.ImmutableDictionary
a des méthodes pour le modifier comme Add
ou Remove
, mais ils créeront un nouveau dictionnaire et retourneront cela, l'original reste inchangé et la copie du nouveau dictionnaire immuable est retournée.Notez que
ReadOnlyDictionary
en passant une autre instance de dictionnaire au constructeur . Cela explique pourquoi un ReadOnlyDictionary
est modifiable (si le dictionnaire sous-jacent est modifié). C'est juste un wrapper qui est protégé contre les changements directs.ImmutableDictionary
: Comment puis-je créer une nouvelle instance d'ImmutableDictionary?Cela explique également pourquoi le ReadOnlyDictionary
n'est pas non thread-safe (mieux: il est aussi thread-safe que le dictionnaire sous-jacent). ImmutableDictionary
est thread-safe car vous ne pouvez pas modifier l'instance d'origine (ni directement ni indirectement). Toutes les méthodes qui le "modifient" renvoient en fait une nouvelle instance.
Mais si vous avez besoin d'un dictionnaire thread-safe et qu'il n'est pas nécessaire qu'il soit immuable, utilisez plutôt ConcurrentDictionary
.
UNE ReadOnlyDictionary<TKey,TValue>
est un wrapper autour d'un autre IDictionary<TKey,TValue>
objet d'implémentation.
Surtout, si "vous" (le code avec accès au ReadOnlyDictionary
) ne peut pas apporter de modifications au dictionnaire via le wrapper, cela ne signifie pas que autre code ne peut pas modifier le dictionnaire sous-jacent.
Donc, contrairement à ce que d'autres réponses peuvent suggérer, vous ne pouvez pas supposer que le ReadOnlyDictionary
n'est pas sujet à modification - juste que "vous" n'y êtes pas autorisé. Ainsi, par exemple, vous ne pouvez pas être sûr que deux tentatives d'accès à une clé particulière produiront le même résultat.
ReadOnlyDictionary
est ReadOnly
ne peut pas ajouter ou supprimer
ImmutableDictonary
peut ajouter ou supprimer mais il est immuable comme une chaîne. Il y a un nouvel objet à ajouter et à supprimer http://tipsandtricks.runicsoft.com/CSharp/Immutables.html