Condividi tramite


Definizione di insiemi

Aggiornamento: novembre 2007

Per insieme si intende un gruppo di oggetti tipizzati in modo analogo.

Gli oggetti di qualsiasi tipo possono essere raggruppati in un singolo insieme del tipo Object per sfruttare i costrutti intrinseci al linguaggio. Ad esempio, l'istruzione foreach in C# (for each in Visual Basic) richiede che tutti gli oggetti nell'insieme siano di un unico tipo.

In un insieme di tipo Object, tuttavia, viene eseguita un'ulteriore elaborazione sui singoli elementi, quale boxing e unboxing o conversioni, che influisce sulle prestazioni dell'insieme. Boxing e unboxing in genere vengono generati durante l'archiviazione o il recupero di un tipo di valore in un insieme del tipo Object.

Gli insiemi generici, ad esempio List<T>, e gli insiemi non generici fortemente tipizzati, ad esempio StringCollection, non sono soggetti a queste riduzioni delle prestazioni se il tipo di elemento è il tipo a cui è destinato l'insieme, ad esempio per l'archiviazione o il recupero di stringhe da StringCollection). Gli insiemi fortemente tipizzati, inoltre, eseguono automaticamente la convalida del tipo di ogni elemento aggiunto all'insieme.

Tutti gli insiemi che implementano direttamente o indirettamente l'interfaccia ICollection o l'interfaccia generica ICollection<T> condividono numerose funzionalità oltre ai metodi per l'aggiunta, la rimozione o la ricerca di elementi:

  • Un enumeratore

    Un enumeratore è un oggetto che scorre l'insieme associato. È simile a un puntatore che si sposta su qualsiasi elemento dell'insieme. L'enumeratore può essere associato a un solo insieme, mentre un insieme può avere più enumeratori. L'istruzione foreach in C# (for each in Visual Basic) utilizza l'enumeratore, nascondendone la complessità di gestione.

  • Membri di sincronizzazione

    La sincronizzazione fornisce la thread safety al momento dell'accesso agli elementi dell'insieme. Gli insiemi non sono thread-safe per impostazione predefinita. Solo alcune classi negli spazi dei nomi System.Collections forniscono un metodo Synchronize che crea un wrapper thread-safe sull'insieme. Tutte le classi in tutti gli spazi dei nomi System.Collections, tuttavia, forniscono una proprietà SyncRoot che può essere utilizzata dalle classi derivate per creare wrapper thread-safe personalizzati. Viene inoltre fornita una proprietà IsSynchronized per determinare se l'insieme è thread-safe. La sincronizzazione non è disponibile nell'interfaccia generica ICollection<T>.

  • Metodo CopyTo

    Tutti gli insiemi possono essere copiati in una matrice utilizzando il metodo CopyTo. Tuttavia, l'ordine degli elementi nella nuova matrice si basa sulla sequenza in cui questi vengono restituiti dall'enumeratore. La matrice risultante è sempre unidimensionale con un limite inferiore pari a zero.

Nell'interfaccia generica ICollection<T> sono inclusi membri aggiuntivi, che non sono disponibili nell'interfaccia non generica.

Le seguenti funzionalità sono implementate in alcune classi negli spazi dei nomi System.Collections:

  • Capacità e conteggio

    La capacità di un insieme indica il numero di elementi che può contenere. Il conteggio di un insieme indica il numero di elementi che esso contiene effettivamente. Una classe BitArray rappresenta un caso particolare, poiché la sua capacità corrisponde alla lunghezza, che a sua volta equivale al conteggio. Alcuni insiemi nascondono la capacità o il conteggio oppure entrambi.

    Tutti gli insiemi negli spazi dei nomi System.Collections espandono automaticamente la capacità una volta raggiunta la capacità corrente. La memoria viene riallocata e gli elementi vengono copiati dal vecchio insieme precedente in uno nuovo. Questa operazione consente di ridurre il codice richiesto per utilizzare l'insieme, ma potrebbe avere un effetto negativo sulle prestazioni dell'insieme. Il modo migliore per evitare che le numerose riallocazioni influiscano in modo negativo sulle prestazioni è di impostare la capacità iniziale sulla dimensione prevista dell'insieme.

  • Limite inferiore

    Il limite inferiore di un insieme è l'indice del primo elemento. Tutti gli insiemi indicizzati negli spazi dei nomi System.Collections sono caratterizzati da un limite inferiore pari a zero. Per impostazione predefinita, Array ha un limite inferiore pari a zero, ma è possibile definire un limite inferiore differente quando si crea un'istanza della classe Array utilizzando CreateInstance.

In genere, le classi System.Collections possono essere suddivise in tre categorie:

  • Insiemi comunemente utilizzati

    Varianti comuni degli insiemi di dati, quali tabelle hash, code, stack, dizionari ed elenchi. Per gli insiemi comunemente utilizzati sono disponibili versioni generiche e non generiche.

  • Insiemi bit

    Insiemi i cui elementi sono flag di bit e funzionano in modo leggermente diverso dagli altri insiemi.

  • Insiemi specializzati

    Insiemi con scopi molto specifici, utilizzati in genere per gestire un particolare tipo di elemento, ad esempio StringDictionary.

Scegliere la classe di insiemi con estrema attenzione. Ogni insieme è dotato di funzionalità proprie e, di conseguenza, ha le proprie limitazioni. Più un insieme è specializzato, più è limitato. Per suggerimenti sulla scelta di un insieme, vedere Selezione di una classe Collection.

Vedere anche

Concetti

Selezione di una classe Collection

Riferimenti

System.Collections

System.Collections.Specialized

System.Collections.Generic

Altre risorse

Insiemi e strutture di dati