Welchen Vorteil haben Sie mit einer Sammlung über List (Of T) in .NET 2.0 +

8

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?

    
Toran Billups 30.01.2009, 14:08
quelle

5 Antworten

4

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.

    
aku 30.01.2009, 14:17
quelle
1

Die Liste ist nicht Thread-sicher und nicht dazu bestimmt, belichtet zu werden. Sie können stattdessen eine Collection (Of T) verwenden (beachten Sie, dass sich diese von CollectionBase unterscheidet) oder einfach IList (Of T) oder IEnumerable (Of T) verfügbar machen.

    
Jon B 30.01.2009 14:17
quelle
1

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.

    
senfo 30.01.2009 15:26
quelle
1

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.

    
Jeroen Landheer 30.01.2009 15:28
quelle
0

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;.
  •   

Quelle

    
ageektrapped 30.01.2009 14:20
quelle

Tags und Links