2012-04-11 1 views
6

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

+0

Wie meinst du "schneiden", genau? Entfernt es es aus 'ConcurrentDictionary'? Nein. Ist es über die IDictionary-Schnittstelle verfügbar? Nr. –

+2

@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? –

+0

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. –

Antwort

10

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.

+0

Sie können auch die MSDN-Dokumentation für ConcurrentDictionary-Implementierungen der 'IDictionary ' -Methoden betrachten: http://msdn.microsoft.com/en-us/library/dd287191.aspx – phoog

6

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).

1

Die Schnittstelle hat keinen Einfluss auf die Implementierung. Es gibt nur einige von ConcurrentDictionary Methoden.

Sie können this oder this hilfreich beim Verständnis der Schnittstellen finden.

0

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.

-1

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.

+0

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