2013-07-01 25 views
33

List<T>IReadOnlyCollection<T>-Schnittstelle implementiert und stellt die AsReadOnly() Methode, die ReadOnlyCollection<T> zurückgibt (die wiederum implementiert IReadOnlyCollection<T>).Liste <T> .AsReadOnly() vs IReadOnlyCollection <T>

Was ist die Verwendung/Grund für AsReadyOnly()? Seine Existenz riecht nach einem oder zwei Randfällen, bei denen es einfach nicht reicht, die Liste einfach als IReadOnlyCollection<T> zurückzugeben.

Am Anfang kann ich es zwar verhindern, dass man die Kosten wegwirft, aber es sieht so aus, als könnten Sie das mit ReadOnlyCollection<T>s Items Accessor machen.

BTW. Die Dokumentation für ReadOnlyCollection<T> Typ liest

Stellt die Basisklasse für eine generische schreibgeschützte Auflistung.

, die in meinem Kopf, Konflikte mit einem Konstruktor als

beschrieben mit

Initialisiert eine neuen Instanz der (...) Klasse, die ein Nur-Lese-Wrapper um die angegebene Liste ist.

Update: ich nicht sehen, dass ReadOnlyCollection<T> ‚s Items geschützt ist.

+0

Ich bevorzuge '.ToArray()'. Einfacher IMO! –

+1

@KierenJohnstone wahrscheinlich auch langsamer. –

Antwort

36

Wenn Sie nur eine tatsächliche List<T> als IReadOnlyList<T> zurückgeben, kann der Anrufer immer nur zurückwerfen und ändern Sie die Liste dann wie sie möchten. Umgekehrt wird durch Aufruf von AsReadOnly() ein schreibgeschützter Wrapper der Liste erstellt, den die Benutzer nicht aktualisieren können. Beachten Sie, dass der schreibgeschützte Wrapper Änderungen widerspiegelt, die an der zugrunde liegenden Liste vorgenommen wurden. Daher kann Code mit Zugriff auf die ursprüngliche Liste ihn mit dem Wissen aktualisieren, dass alle Benutzer der schreibgeschützten Version diese Änderungen sehen.

+0

Aber ich kann 'AsReadOnly() zurückweisen. Items', kann ich nicht? – mayu

+5

@Tymek Sie können nicht: 'AsReadOnly()' erstellt eine neue, nicht-'List ' Klasse, die keine öffentlichen Methoden hat, die eine Mutation der zugrunde liegenden Liste erlauben. ('Items' sind *' protected' *, so dass zufällige Benutzer nicht darauf zugreifen können.) – dlev

+0

Items sind nicht die ursprüngliche Liste, Sie können die ursprüngliche Liste nicht ändern. – Steven

18

Zunächst einmal ist es nicht so AsReadOnly() hinzugefügt wurde, weil IReadOnlyList<T> nicht gut genug ist - IReadOnlyList<T> ist nur mit .NET 4.5 beginnen, während AsReadOnly() Methode, da .NET existiert 2.

Noch wichtiger: AsReadOnly() und IReadOnlyList<T> dienen sehr unterschiedlichen Zwecken.

ReadOnlyCollection<T> ist für die Implementierung von Objektmodellen gedacht, zum Beispiel Dinge wie und Dictionary<K,V>.Values. Dies ist für Szenarien gedacht, in denen Verbraucher den Inhalt nicht ändern können, während der Produzent dies kann. Es funktioniert zusammen mit Collection<T>, die Hooks für den Besitzer bietet, um Änderungen zu validieren oder Nebenwirkungen zu verursachen, wenn Elemente hinzugefügt werden.

IReadOnlyList<T> auf der anderen Seite ist einfach eine Schnittstelle, die eine schreibgeschützte Ansicht der Sammlung bietet. Methoden können es verwenden, um zu sagen: "Ich brauche eine zufällige Zugriffssammlung, aber ich muss sie nicht modifizieren können".Zum Beispiel kann eine BinarySearch Methode könnte wie folgt aussehen:

public int BinarySearch<T>(IReadOnlyList<T> list, int start, int length); 

Um diese Methode nützlich zu machen, ist es erforderlich, in jeder Liste weitergeben zu können. Das Erzwingen, Wrapper-Sammlungen zu erstellen, wäre unerschwinglich teuer.

Verwandte Themen