Définition de collections

Une collection est un ensemble d'objets du même type qui sont regroupés ensemble.

Les objets d'un type quelconque peuvent être regroupés en une collection du type Object afin de tirer parti des constructions inhérentes au langage. Par exemple, l'instruction C# foreach (for each en Visual Basic) s'attend à ce que tous les objets de la collection soient du même type.

Cependant, dans une collection de type Object, les différents éléments sont soumis à un traitement supplémentaire, des opérations boxing et unboxing ou des conversions par exemple, qui pénalise les performances de la collection. Les conversions boxing et unboxing se produisent généralement en cas de stockage ou d'extraction d'un type valeur dans une collection de type Object.

Les collections génériques, telles que List, et les collections non génériques fortement typées, telles que StringCollection, évitent cette dégradation des performances si le type de l'élément est le type auquel la collection est destinée (par exemple, le stockage ou l'extraction de chaînes à partir de StringCollection). En outre, les collections fortement typées exécutent automatiquement la validation du type de chaque élément ajouté à la collection.

Toutes les collections qui implémentent directement ou indirectement l'interface ICollection ou l'interface générique ICollection partagent plusieurs fonctionnalités en plus des méthodes permettant d'ajouter, de supprimer ou de rechercher des éléments :

  • Un énumérateur.

    Un énumérateur est un objet qui effectue une itération sur la collection qui lui est associée. Il peut être considéré comme un pointeur mobile vers un élément quelconque de la collection. Un énumérateur ne peut être associé qu'à une seule collection, mais une collection peut avoir plusieurs énumérateurs. L'instruction C# foreach (for each en Visual Basic) utilise l'énumérateur et masque la complexité de manipulation de celui-ci.

  • Membres de la synchronisation.

    La synchronisation garantit la sécurité des threads lors de l'accès à des éléments de la collection. Par défaut, les collections ne sont pas thread-safe. Seules quelques classes de l'espace de noms System.Collections fournissent une méthode Synchronize qui crée un wrapper thread-safe par-dessus la collection. Cependant, toutes les classes de l'espace de noms System.Collections fournissent une propriété SyncRoot que des classes dérivées peuvent utiliser pour créer leur propre wrapper thread-safe. Une propriété IsSynchronized est également fournie pour déterminer si la collection est thread-safe. La synchronisation n'est pas disponible dans l'interface générique ICollection.

  • Méthode CopyTo .

    Toutes les collections peuvent être copiées dans un tableau à l'aide de la méthode CopyTo ; toutefois, l'ordre des éléments dans le nouveau tableau dépend de la séquence dans laquelle l'énumérateur les retourne. Le tableau résultant est toujours unidimensionnel avec une limite inférieure de zéro.

Notez que l'interface générique ICollection possède des membres supplémentaires que l'interface non générique n'inclut pas.

Les fonctionnalités suivantes sont implémentées dans certaines classes de l'espace de noms System.Collections :

  • Capacité et décompte.

    La capacité d'une collection est le nombre d'éléments qu'elle peut contenir. Le décompte d'une collection est le nombre d'éléments qu'elle contient réellement. BitArray est un cas spécial ; sa capacité équivaut à sa longueur, qui est la même que son décompte. Certaines collections masquent la capacité ou le décompte, ou les deux.

    Toutes les collections de l'espace de noms System.Collections étendent automatiquement leur capacité lorsque la capacité actuelle est atteinte. La mémoire est réallouée et les éléments sont copiés de l'ancienne collection vers la nouvelle. Le code nécessaire pour utiliser la collection est ainsi réduit, mais les performances de la collection peuvent quand même s'en ressentir. La meilleure façon d'éviter la dégradation des performances due à des réallocations multiples est de définir une capacité initiale égale à la taille estimée de la collection.

  • Limite inférieure.

    La limite inférieure d'une collection est l'index de son premier élément. Toutes les collections indexées dans l'espace de noms System.Collections ont une limite inférieure de zéro. Array possède par défaut une limite inférieure de zéro, mais une limite inférieure différente peut être définie lors de la création d'une instance de la classe Array à l'aide de CreateInstance.

Les classes System.Collections sont généralement réparties en trois catégories :

  • Collections fréquemment utilisées.

    Il s'agit des variations communes des collections de données, telles que les tables de hachage, les files d'attente, les piles, les dictionnaires et les listes. Les collections fréquemment utilisées possèdent des versions génériques et des versions non génériques.

  • Collections binaires.

    Il s'agit de collections dont les éléments sont des bits indicateurs. Leur comportement est un peu différent de celui des autres collections.

  • Collections spécialisées.

    Ces collections répondent à des objectifs hautement spécifiques ; il s'agit généralement de gérer un élément de type spécifique, tel que StringDictionary.

Veillez à choisir votre classe de collection avec beaucoup de soin. Si chaque collection a sa propre fonctionnalité, elle a également ses propres limites. Plus une collection est spécialisée, plus elle est limitée. Pour des conseils sur le choix d'une collection, consultez Sélection d'une classe de collection.

Voir aussi

Référence

System.Collections
System.Collections.Specialized
System.Collections.Generic

Concepts

Sélection d'une classe de collection

Autres ressources

Collections et structures de données