.NET-Listen im Überblick

Das .NET Framework stellt verschiedene Listen-Implementierungen bereit. Je nach Anwendungsfall muss die richtige Listenklasse ausgewählt werden.

Die generische Klasse List<T> aus dem Namespace System.Collections.Generic

Der Klassiker für schnelle dynamische Listen ist die seit dem .NET Framework 2.0 vorhandene generische Klasse List<T>. Sie basiert intern auf einem typisierten Array. Die Funktionen IndexOf(T) und Conatins(T) benutzen die lineare Suche, die bei n Elementen bis zu n Vergleichsoperationen ausführt. Der Aufwand für die Suche eines Elements ist daher direkt proportional zur Elementanzahl. Für kleine Listen ist die lineare Suche dennoch die beste Wahl.

Um die Konformität zu den Microsoft .NET Framework Design Guidelines nicht zu beeinträchtigen, wird empfohlen, generische Listen nur lokal oder als private Membervariablen einzusetzen. Für öffentliche Memberelemente sollte kein Gebrauch von generischen Listen gemacht werden, da dies die Erweiterbarkeit von Bibliotheken einschränkt. Der Grund dafür ist, dass generische Listen keine virtuellen Funktionen besitzen und Änderungen des Listenverhaltens nur durch eine andere Basisklasse realisiert werden können. Eine Bibliothek würde in diesem Fall nicht mehr schnittstellenkompatibel bleiben.

Öffentliche Funktionen mit generischer Listen als Parameter oder Rückgabewert können statt des konkreten Listentyps auf die Listenschnittstelle IList<T> ausweichen, um die Konformität zu den Microsoft .NET Framework Design Guidelines zu wahren. Dies beschehrt weitere Vorteile, da nun auch typisierte Arrays und andere Listen, die IList<T> implementieren, übergeben werden können.

Die generische Klasse Collection<T> aus dem Namespace System.Collections.ObjectModel

Die generische Listenimplementierung Collection<T>, die selbstverständlich die Schnittstelle IList<T> implementiert, ist für benutzerdefinierte Erweiterungen konzipiert. Es existieren virtuelle Funktionen für alle möglichen Änderungsoperationen, die es erlauben, jedes erdenkliche benutzerdefinierte Verhalten hinzuzufügen. Der Preis für diese Flexibilität ist eine etwas geringere Performance.

Bei Verwendung des Standardkonstruktors basiert diese Klasse intern auf der Klasse List<T>. Wird der Konstruktor Collection<T>(IList<T> list) benutzt, wird die angegebene Liste intern verwendet, da dieser Konstruktor lediglich die Referenz der übergebenen Liste speichert.

Ähnliche Artikel

Schreiben Sie einen Kommentar