Freigeben über


Definieren von Auflistungen

Aktualisiert: November 2007

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.

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

    Die Synchronisierung bietet Threadsicherheit beim Zugriff auf die Elemente der Auflistung. Die Auflistungen sind nicht grundsätzlich threadsicher. 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 in den System.Collections-Namespaces 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 Neuzuweisungen 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 haben eine untere Grenze von 0 (null). Array hat standardmäßig eine untere Grenze von 0 (null), beim Erstellen einer Instanz der Array-Klasse mit CreateInstance kann jedoch eine abweichende untere Grenze 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. Von häufig verwendeten Auflistungen gibt es generische und nicht 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

Konzepte

Auswählen einer Auflistungsklasse

Referenz

System.Collections

System.Collections.Specialized

System.Collections.Generic

Weitere Ressourcen

Auflistungen und Datenstrukturen