Was ist der beste Weg, um ein schreibgeschütztes Array in C # zu erstellen?
Habe ich das für extrem unwahrscheinlich und die ursprüngliche situation, die wollen, um wieder eine readonly array aus meinem Eigentum. Bisher bin ich nur bewusst Weg, es zu tun - durch die System.Collections.ObjectModel.ReadOnlyCollection<T>
. Aber das scheint irgendwie merkwürdig zu mir, nicht zu erwähnen, dass diese Klasse die Fähigkeit verliert, Zugriff auf array-Elemente durch Ihren index (Hinzugefügt: Hoppla, ich verpasste den indexer). Ist es nicht besser? Etwas machen könnte, das array selbst unveränderlich sind?
InformationsquelleAutor der Frage Vilx- | 2010-01-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
ReadOnlyCollection<T>
. Es ist read-only und, im Gegensatz zu dem, was Sie glauben, es hat einen indexer.Arrays sind nicht unveränderbar und es gibt keine Möglichkeit, Sie so ohne einen wrapper wie
ReadOnlyCollection<T>
.Beachten Sie, dass die Schaffung einer
ReadOnlyCollection<T>
wrapper ist eine O(1) - operation, und es fallen keine Leistung Kosten.Update
Andere Antworten vorgeschlagen haben, nur casting-Sammlungen zu den neueren
IReadOnlyList<T>
, die sichIReadOnlyCollection<T>
fügen Sie ein indexer. Leider nicht wirklich geben Ihnen die Kontrolle über die Wandlungsfähigkeit der Kollektion, da könnte es sein, die cast zurück zu der ursprünglichen Sammlung geben und mutiert.Statt, Sie sollte immer noch die
ReadOnlyCollection<T>
(dieList<T>
MethodeAsReadOnly()
oderArray
s statische MethodeAsReadOnly()
hilft zu wickeln Listen und arrays entsprechend) zu erstellen, die eine unveränderliche Zugriff auf die Sammlung und dann aussetzen, entweder direkt oder als eine der Schnittstellen unterstützt, einschließlichIReadOnlyList<T>
.InformationsquelleAutor der Antwort Jeff Yates
.NET Framework 4.5 eingeführt
IReadOnlyList<T>
die sich vonIReadOnlyCollection<T>
hinzufügenT this[int index] { /*..*/get; }
.Können Sie werfen aus
T[]
zuIReadOnlyList<T>
. Ein Vorteil dabei ist, dass(IReadOnlyList<T>)array
verständlicherweise gleicharray
; keine Boxen beteiligt ist.Natürlich als wrapper verwendet wird,
(T[])GetReadOnlyList()
wäre veränderlich.InformationsquelleAutor der Antwort Warty
Aus .NET Framework 2.0 und da ist Array.AsReadOnlydie automatisch erstellt eine ReadOnlyCollection wrapper für Sie.
InformationsquelleAutor der Antwort N8allan
Wenn Sie wirklich wollen, ein array zurückgegeben, aber Angst haben, dass der Verbraucher das array Durcheinander mit den internen Daten, nur Rückgabe einer Kopie des Arrays. Ich persönlich denke immer noch
ReadOnlyCollection<T>
ist der Weg zu gehen, aber wenn Sie WIRKLICH wollen ein array.....InformationsquelleAutor der Antwort BFree
IEnumerable in den Sinn kommt.
InformationsquelleAutor der Antwort epitka
Möchten Sie vielleicht, um die IEnumerable-Schnittstelle implementieren und zu überladen das[int] - operator den Zugriff zu verweigern, um es der setter
InformationsquelleAutor der Antwort Morfildur
Gibt es nun Unterstützung für Unveränderliche Sammlungen.
Sehen https://www.nuget.org/packages/System.Collections.Immutable
Diese unterstützt alle der folgenden:
InformationsquelleAutor der Antwort Henry