web-dev-qa-db-fra.com

Quelle est la différence entre un ReadOnlyDictionary et un ImmutableDictionary?

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?

23
matt_rule
  • Un ReadOnlyDictionary peut être initialisé une fois via le constructeur, alors vous ne pouvez pas y ajouter ou supprimer des éléments (ils jettent NotSupportedExceptions). 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.
  • Un 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

  • vous initialisez le 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.
  • vous ne pouvez pas utiliser de constructeur pour 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 .

33
Tim Schmelter

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.

5
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

1
Snr