Warum sollte ImmutableList über ReadOnlyCollection verwendet werden?
.NET 4.5 hat einen neuen namespace System.Sammlungen.Unveränderlich
Dieses Paket stellt die Sammlungen, die thread-sicher und garantiert nie Ihren Inhalt ändern, auch bekannt als unveränderliche Sammlungen.
Ich bin verwirrt. Ist das nicht die thread-Sicherheit problem bereits gelöst, indem die ReadOnlyCollection Klasse? Warum ImmutableList statt?
Ich weiß, es gibt auch eine IReadOnlyList - Schnittstelle. Das löst nicht die thread-Sicherheit problem implizit, da die anderen threads können das Objekt Bearbeiten durch eine andere Schnittstelle.
InformationsquelleAutor der Frage Colonel Panic | 2015-05-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mit einem
ReadOnlyCollection
:Das kann nicht passieren mit einem
ImmutableList
.InformationsquelleAutor der Antwort James Thorpe
ReadOnlyCollection<T>
nicht lösen die thread-Sicherheit Probleme. Es ist lediglich ein wrapper umIlist<T>
. Es nicht macht Mitglieder zu ändern, die Sammlung, aber Sie können immer ändern Sie es mit der zugrunde liegenden Auflistung Referenz.Wenn die zugrunde liegende Auflistung geändert wird, ist es nicht sicher aufzählen, die
ReadOnlyCollection<T>
. Wenn Sie dies tun, erhalten Sie die gleichenInvalidOperationException
mit der Meldung "die Auflistung wurde geändert; der Enumerationsvorgang kann nicht ausgeführt werden...".Vom
ReadOnlyCollection<T>
ImmutableList
auf der anderen Seite ist unveränderlich und somit inhärent thread-sicher.InformationsquelleAutor der Antwort Sriram Sakthivel
ReadOnlyCollection
wie der name schon sagt, nur gelesen werden können.Auf dem anderen hand, Sie können den anfügen/entfernen von Elementen zu/von einem
ImmutableList
durch den Aufruf derAdd
/Remove
/Clear
Methoden, zum Beispiel, die eine neue, unveränderliche Liste.InformationsquelleAutor der Antwort dcastro
In multi-threaded-Szenarien, beachten Sie, dass nur-lese-Sammlungen sind immer noch nicht thread-safe.
Aus der
ReadOnlyCollection<T>
Dokumentation:Da Kollektionen, wie
List<T>
und andere, sind nicht thread-sicher, so ist nicht die nur-lese-Kollektion.Wichtig: Es gibt einige Ausnahmefälle, die Sie finden nicht explizit erklärt im MSDN. Einige der Vorgänge, die scheinbar nur Lesen, Inhalte einer Sammlung, sind in der Tat ändern die internen Strukturen der Sammlung. Warum ist diese nicht angegeben? - Ein offensichtlicher Grund ist, weil, dass ist eine Implementierung detail, das reflektiert nicht die API. Das Ergebnis ist, dass selbst wenn Sie nicht ändern, die
List<T>
eingewickelt in eineReadOnlyCollection<T>
und verwenden Sie nur Getter, der Absturz könnte noch passieren in multi-Threading-Umgebung!Quintessenz ist, dass die Sammlungen, auch wenn verpackt in eine
ReadOnlyCollection
kann nicht verwendet werden, die in den multi-Threading-Umgebung aus der box.Im Gegensatz zu
ReadOnlyCollection
unveränderlichen collections garantieren, dass keiner der internen Strukturen jemals ändern wird, nachdem ein Verweis auf eine Sammlung erworben wurde. Beachten Sie, dass diese Strukturen noch nicht wirklich unveränderlich sind. Sie sind, stattdessen freezable. Das bedeutet, dass die Struktur intern ändern, für eine Weile, bis es eingefroren und an den Aufrufer zurückgegeben. Über diesen Punkt, alle anderen Anrufe auf die unveränderliche collection werden nur änderungen außerhalb der Strukturen der Zugriff über die original-Referenz.Fazit: nur-Lese-Sammlungen sind nicht thread-safe; unveränderliche Sammlungen sind thread-sicher.
InformationsquelleAutor der Antwort Zoran Horvat