Wird die threadsichere Implementierung durch eine Umwandlung von ConcurrentDictionary in IDictionary abgeschnitten, da IDictionary keine Methoden GetOrAdd und AddOrUpdate enthält?Umwandlung von ConcurrentDictionary in IDictionary
Antwort
Das resultierende Objekt ist immer noch ein Concurrent Dictionary. Die Aufrufe wie Hinzufügen oder Entfernen verwenden die zugrunde liegende Implementierung TryAdd und TryRemove (die Thread-sicher sind). Wenn ein Objekt in einen anderen Typ umgewandelt wird, ändert sich das Objekt selbst nicht.
Zur Verdeutlichung können Sie auch Tools wie ILSpy verwenden, um zu sehen, wie die standardmäßigen IDictionary-Methoden implementiert sind und ob sie weiterhin Thread-sicher sind.
Sie können auch die MSDN-Dokumentation für ConcurrentDictionary-Implementierungen der 'IDictionary
IDictionary
ist nur eine Schnittstelle. Wenn Sie es umwandeln, ist das Ergebnis eine Implementierung von ConcurrentDictionary, bei der die Methoden GetOrAdd
und AddOrUpdate
fehlen.
Vermutlich können Sie immer noch die Item
Eigenschaft verwenden und die Add
und ContainsKey
Methoden (anstelle der GetOrAdd
und AddOrUpdate
) Methoden und Ihr gegossene Objekt wird noch Thread-sicher sein (da die zugrunde liegende Implementierung ist ein ConcurrentDictionary
).
Es wäre bei großen ConcurrentDictionary
Objekt durch IDictionary
förmige Keyhole wie der Blick - Sie nur IDictionary
Form sehen konnte, aber es immer noch ConcurrentDictionary
wäre.
Kurze Antwort-Nr.
Sie manipulieren ein Objekt über eine Schnittstelle und verwenden daher immer noch die konkrete Implementierung. Sie verlieren weder Funktionalität noch ihre Methoden. Sie sind einfach nicht verfügbar.
Auf der Randnotiz benötigen Sie eine explizite Umwandlung beim Downcasting, keine Notwendigkeit für eine explizite Umwandlung beim Upcasting - immer sicher, dies zu tun.
Sorry aber ConcurrentDictionary fügen zwei neue hinzu Methoden und verstecken Sie andere, so dass die Implementierung Threadsafe nur für die neuen Methoden und nicht für die versteckten Methoden hinzufügen kann. MSDN Dokumentation klärt es nicht, also fragte ich es.Aber nachdem ich die besten Kommentare gelesen hatte und einen Blick auf den ConcurrentDictionary-Prototyp geworfen hatte, sah ich, dass es das Dictionary nicht erweitert, und das beruhigte mich, dass es unwahrscheinlich ist, dass das Casting auf IDictionary das erweiterte Version Dictionary verwendet. – Luciano
Wie meinst du "schneiden", genau? Entfernt es es aus 'ConcurrentDictionary'? Nein. Ist es über die IDictionary-Schnittstelle verfügbar? Nr. –
@JamesMichaelHare: Er bedeutet, dass, wenn Sie auf "IDictionary" werfen, macht das resultierende Objekt Thread unsicher? Mit anderen Worten, verwandelt es es in ein gewöhnliches Wörterbuch? –
Wird es weiterhin threadsicher sein? Ja, so wie es ohne diese Operationen sein kann. Das heißt, wenn Sie eine atomare 'GetOrAdd()' benötigen, werden Sie kein Glück haben. –