C #: Unterschied zwischen List und Collection (CA1002, Setzen Sie generische Listen) [Duplikat]

StackOverflow https://stackoverflow.com/questions/1232108

  •  22-07-2019
  •  | 
  •  

Frage

    

Diese Frage bereits eine Antwort hier:

         

Versuchte Run-Code-Analyse an einem Projekt hier zu laufen, und bekam eine Reihe von Warnungen, die so etwas wie dies gesagt:

  

CA1002: Microsoft.Design: Change 'Liste << em> Sometype >' in ' SomeClass.SomeProtectedOrPublicProperty ' zu verwenden, Sammlung, oder Readonlycollection KeyedCollection

Warum sollte ich Collection<T> statt List<T>? Als ich in der Dokumentation Msdn aussehen, scheint sie fast gleich. die Fehler Hilfe für die Warnung Nach der Lektüre fand ich, dass

  

System.Collections.Generic.List (T) _is eine generische Sammlung für Leistung ausgelegt keine Vererbung und daher keine virtuellen Mitglieder enthalten.

Aber was bedeutet das eigentlich? Und was soll ich tun, stattdessen werden?

Soll ich mit List<T> halten intern und dann in den Eigenschaften zurückgeben new Collection<T>(someList) statt? Oder sollte ich beginnen gerade mit Collection<T> statt List<T>?

War es hilfreich?

Lösung

Kurz gesagt, die generische Liste nicht über virtuelle Methoden für Hinzufügen, Entfernen usw., wie es entworfen wurde, schnell, nicht erweiterbar zu sein. Das bedeutet, dass Sie nicht diese konkrete Umsetzung heraus für eine nützliche Unterklasse tauschen können (obwohl man kann es Unterklasse, da es nicht abgedichtet ist).

Daher kann durch die Liste Belichtung selbst, können Sie nie Ihre Sammlung erweitern zu verfolgen Operationen hinzuzufügen oder zu entfernen (zum Beispiel), ohne den öffentlichen Auftrag der Klasse zu brechen.

Ihre Sammlung als IList oder ein-so Durch Belichtung, können Sie immer noch die Liste als eigentliche Träger-Speicher verwenden, aber Sie zukünftige Erweiterbarkeit behalten, wie Sie später die concerete Implementierung auslagern können, ohne den öffentlichen Auftrag Ihrer Klasse zu ändern .

Andere Tipps

Collection macht einige virtuelle Mitglieder (Einfügen, Entfernen, Set, klar), die Sie überschreiben können und zusätzliche Funktionen (wie zB Benachrichtigungsereignisse) bereitzustellen, wenn die Sammlung geändert wird.

Sie können dies jetzt nicht brauchen, aber es ist eine häufige Anforderung für Klassen, die Sammlungen enthalten, so ist es am besten für sie im Voraus zu planen. Da Collection im Sinne des Erweiterungs ausgelegt ist, es ist sehr flexibel. Wenn in der Zukunft müssen Sie sich entscheiden, Sie einige zusätzliche Funktion in der Sammlung können Sie nur an die öffentliche Schnittstelle der Klasse ohne Änderung verlängern. Wenn Sie eine Liste benutzt hatten, hätten Sie es zu einer Sammelstelle zu ändern, was bedeutet, würde es den Anrufers Ihrer Klasse gebrochen hat, weil sie geändert werden müßten Listen zu verwenden.

List auf der anderen Seite ist mit der Leistung im Auge, so sollte nur in bestimmten Fällen verwendet werden, in denen die Leistung sehr wichtig ist. Denn es ist nicht erweiterbar zukünftige Änderungen an irgendetwas eine Liste verwendet, wird alles andere von ihm abhängig brechen. Normalerweise sollte List nur intern innerhalb sehr niedrigen Niveaus Klassen verwendet werden und nicht auf etwas ausgesetzt, um die Chance auf Zukunft zu brechen Änderungen zu reduzieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top