Definieren von Auflistungen
Eine Auflistung ist eine Reihe von Objekten ähnlichen Typs, die zu einer Gruppe zusammengefasst werden.
Objekte eines beliebigen Typs können zu einer einzelnen Auflistung vom Typ Object zusammengefasst werden, um die Vorteile von spracheigenen Konstrukten nutzen zu können. Die foreach-Anweisung in C# (for each in Visual Basic) erwartet beispielsweise, dass alle Objekte in der Auflistung denselben Typ aufweisen.
In einer Auflistung des Typs Object werden jedoch zusätzliche Verarbeitungsvorgänge für einzelne Elemente ausgeführt (z. B. Boxing und Unboxing oder Konvertierungen), die Einfluss auf die Leistungsfähigkeit der Auflistung haben. Das Boxing und Unboxing tritt normalerweise auf, wenn ein Werttyp in einer Auflistung des Typs Object gespeichert oder abgerufen wird.
Generische Auflistungen wie List<T> sowie streng typisierte, nicht generische Auflistungen wie StringCollection vermeiden diese Verarbeitungsschritte, wenn der Elementtyp derjenige Typ ist, für den die Auflistung bestimmt ist (z. B. beim Speichern oder Abrufen von Zeichenfolgen aus StringCollection). Zusätzlich führen streng nach Typen getrennte Auflistungen eine Typvalidierung für jedes Element durch, das der Auflistung hinzugefügt wird. Aus diesen Gründen empfehlen wir dringend, falls möglich generische Auflistungsklassen zu verwenden.
Alle Auflistungen, die die ICollection-Schnittstelle oder die generische ICollection<T>-Schnittstelle direkt oder indirekt implementieren, verfügen neben Methoden zum Hinzufügen, Entfernen oder Suchen von Elementen über weitere gemeinsame Features:
Einen Enumerator
Ein Enumerator ist ein Objekt, das die zugeordnete Auflistung durchläuft. Er kann als beweglicher Zeiger auf die Elemente in der Auflistung angesehen werden. Ein Enumerator kann nur einer Auflistung zugewiesen sein, aber eine Auflistung kann mehrere Enumeratoren haben. Die foreach-Anweisung in C# (for each in Visual Basic) verwendet den Enumerator, wodurch dessen Bearbeitung weniger komplex ist.
Synchronisierungsmember (nur System.Collections-Klassen).
Für Legacyauflistungstypen im System.Collections-Namespace bietet Synchronisierung ein gewisses Maß an Threadsicherheit beim Zugriff auf Elemente der Auflistung. Die Auflistungen sind nicht grundsätzlich threadsicher. Wenn Sie skalierbaren und effizienten Multithreadzugriff auf eine Auflistung benötigen, verwenden Sie eine der Klassen im System.Collections.Concurrent-Namespace. Weitere Informationen hierzu finden Sie unter Threadsichere Auflistungen.
Nur wenige Klassen im System.Collections-Namespace stellen eine Synchronize-Methode bereit, die einen threadsicheren Wrapper für die Auflistung erstellt. Alle Klassen in allen System.Collections-Namespaces stellen jedoch eine SyncRoot-Eigenschaft bereit, die von abgeleiteten Klassen zum Erstellen eigener threadsicherer Wrapper verwendet werden kann. Eine IsSynchronized-Eigenschaft wird ebenfalls bereitgestellt. Sie wird zur Feststellung der Threadsicherheit verwendet. Die Synchronisierung ist in der generischen ICollection<T>-Schnittstelle nicht verfügbar.
Die CopyTo-Methode.
Alle Auflistungen können mit der CopyTo-Methode in ein Array kopiert werden. Die Reihenfolge der Elemente im neuen Array beruht jedoch auf der Sequenz, in der sie vom Enumerator zurückgegeben werden. Das resultierende Array ist stets eindimensional und hat als untere Grenze 0 (null).
Beachten Sie, dass die generische ICollection<T>-Schnittstelle im Gegensatz zur nicht generischen Schnittstelle über zusätzliche Member verfügt.
Die folgenden Features sind in einigen Klassen in den System.Collections-Namespaces implementiert:
Kapazität und Anzahl
Die Kapazität einer Auflistung beschreibt die Anzahl der Elemente, die sie enthalten kann. Die Anzahl einer Auflistung beschreibt die Anzahl der Elemente, die sie tatsächlich enthält. BitArray ist ein Sonderfall. Die Kapazität entspricht der Länge, und beides stimmt mit der Anzahl überein. Einige Auflistungen blenden die Kapazität oder die Anzahl oder beides aus.
Bei allen Auflistungen wird automatisch die Kapazität erhöht, wenn die aktuelle Kapazität erreicht ist. Der Speicher wird neu zugewiesen, und die Elemente werden von der bisherigen Auflistung in die neue Auflistung kopiert. Dadurch wird der für die Verwendung der Auflistung erforderliche Code verringert. Die Leistung der Auflistung kann allerdings negativ beeinflusst werden. Die beste Möglichkeit zur Vermeidung von Leistungsverlusten durch vielfache Neubelegungen von Speicher besteht darin, die anfängliche Kapazität als geschätzte Größe der Auflistung festzulegen.
Unterer Grenzwert
Die untere Grenze einer Auflistung ist der Index des ersten darin enthaltenen Elements. Alle indizierten Auflistungen in den System.Collections-Namespaces verfügen über eine Untergrenze von 0 (null). Array besitzt standardmäßig eine Untergrenze von 0 (null), doch beim Erstellen einer Instanz der Array-Klasse mithilfe von CreateInstance kann eine andere Untergrenze definiert werden.
System.Collections-Klassen können allgemein in drei Typen klassifiziert werden:
Häufig verwendete Auflistungen
Dies sind allgemeine Variationen von Datenauflistungen, z. B. Hashtabellen, Warteschlangen, Stapel, Wörterbücher und Listen. Zahlreiche häufig verwendete Auflistungen besitzen nicht generische Versionen, generische Versionen und threadsichere generische Versionen.
Bitauflistungen
Hierbei handelt es sich um Auflistungen, deren Elemente nur aus Bitflags bestehen. Diese Auflistungen verhalten sich etwas anders als die übrigen.
Spezialisierte Auflistungen
Diese Auflistungen werden für spezielle Anforderungen verwendet, normalerweise für einen bestimmten Elementtyp, z. B. StringDictionary.
Wählen Sie die entsprechende Auflistungsklasse mit Bedacht. Da jede Auflistung ihre eigene Funktionsweise hat, hat sie auch ihre eigenen Grenzen. Je höher eine Auflistung spezialisiert ist, um so enger sind die Grenzen gezogen. Tipps zur Auswahl von Auflistungen finden Sie unter Auswählen einer Auflistungsklasse.
Siehe auch
Referenz
System.Collections.Specialized
Konzepte
Auswählen einer Auflistungsklasse