Ich hatte einen anderen Entwickler gefragt, warum ich List überall benutze ... und ich dachte eine Minute lang darüber nach ... und konnte mir keine definitive Antwort einfallen lassen.
Wenn Sie von der Auflistungsbasisklasse erben, um sie zu erweitern, anstatt List (Of T) zu verwenden - welche Vorteile erhalten Sie? Oder - was bekommst du nicht mit List?
Generische Liste gibt Ihnen einen Leistungsschub.
Siehe diese Frage:
Haben C # Generika einen Leistungsvorteil?
>Zitat aus MSDN :
Es ist zu Ihrem Vorteil, das zu verwenden typspezifische Implementierung der Liste & lt; (Of & lt; (T & gt;) & gt;) Klasse statt Verwenden der ArrayList-Klasse oder Schreiben eine stark typisierte Wrapper-Sammlung selbst . Der Grund ist dein Implementierung muss tun, was die .NET Framework macht das schon für Sie, und die Common Language Runtime kann teilen Microsoft Zwischensprachcode und Metadaten, die Ihre Implementierung kann nicht.
Eine generische Liste & lt; & gt; wurde für Geschwindigkeit und internen Gebrauch entwickelt. Die generische Sammlung & lt; & gt; auf der anderen Seite wurde für die Erweiterbarkeit konzipiert.
Einer der Vorteile der Sammlung & lt; & gt; Klasse ist, dass Sie einige verschiedene Methoden überschreiben können (ClearItems (), InsertItem (), RemoveItem () und SetItem ()). Die generische Liste & lt; & gt; type bietet dagegen keine Methoden, die überschrieben werden können.
Warum ist das wichtig? Nehmen Sie zum Beispiel an, dass zukünftige Anforderungen verlangen, dass Sie ein ItemAdded-Ereignis auslösen, wenn ein Element zur Sammlung hinzugefügt wird. Hattest du die Liste & lt; & gt; Typ, Sie haben nicht zu viele Optionen. Hattest du die Sammlung & lt; & gt; Sie können jedoch ein neues ItemAdded-Ereignis anzeigen und die InsertItem () -Methode überschreiben, sodass das ItemAdded-Ereignis beim Hinzufügen eines Elements ausgelöst wird.
Geben Sie Casting kostet Zeit und wird verhindert, wenn Sie Generika verwenden. Wenn Sie List (Of T) verwenden, ist kein Typ-Casting erforderlich, da es sich um eine stark typisierte Sammlung handelt. Wenn Sie ArrayList verwenden, wird von Objekt auf Ihren eigenen Typ und umgekehrt umgesetzt, was zusätzlichen Overhead verursacht.
Außerdem verhindern Sie Typumwandlungsprobleme, die Sie zur Kompilierzeit nicht feststellen können. (Wenn Sie beispielsweise eine int in einer Array-Liste verwenden, die Strings enthalten soll, stellt dies kein Problem dar, wenn Sie eine Array-Liste verwenden, kann jedoch zu einer ungültigen Instanz führen, wenn Sie zur Laufzeit kein int erwarten. Durch die Verwendung generischer Listen oder Auflistungen wird dies verhindert Der Code wird nicht kompiliert.)
Hoffe, das hilft.
Die Übernahme von Collection (Of T) wird von Microsoft empfohlen. Es ist nicht garantiert, dass die List (Of T) API von Version zu Version gleich bleibt. Wenn Sie also List (Of T) in Ihren öffentlichen Schnittstellen verwenden, kann Ihr Code bei der Ausführung neuer Versionen der CLR beschädigt werden.
Krzysztof Cwalina, einer der Designer des BCL, sagt über List & lt; T & gt;:
Warum wir die Verwendung von List & lt; T & gt; nicht empfehlen in öffentlichen APIs
Wir empfehlen die Verwendung von List & lt; T & gt; in öffentlichen APIs aus zwei Gründen.
- Liste & lt; T & gt; ist nicht dafür gedacht, erweitert zu werden. d. h., Sie können keine Mitglieder überschreiben. Dies bedeutet beispielsweise, dass ein Objekt, das List & lt; T & gt; von einer Eigenschaft wird nicht benachrichtigt, wenn die Sammlung geändert wird. Sammlung & lt; T & gt; Überschreibt das geschützte SetItem-Element, um "benachrichtigt" zu werden, wenn neue Elemente hinzugefügt oder ein vorhandenes Element geändert wird.
- Liste & lt; T & gt; hat viele Mitglieder, die in vielen Szenarien nicht relevant sind. Wir sagen, dass List & lt; T & gt; ist für öffentliche Objektmodelle zu "beschäftigt". Stellen Sie sich die ListView.Items-Eigenschaft vor, die die Liste & lt; T & gt; mit all seinem Reichtum. Betrachten Sie nun den tatsächlichen ListView.Items-Rückgabetyp; es ist viel einfacher und ähnelt Collection & lt; T & gt; oder ReadOnlyCollection & lt; T & gt;.
Tags und Links .net generics collections