Le collezioni in Visual Basic servono per memorizzare un gruppo di oggetti o valori in una variabile. Le collezioni standard, come Collection, ArrayList e le generiche List(Of T), forniscono vari metodi per accedere, aggiungere e rimuovere elementi, e si differenziano per sicurezza di tipo, prestazioni e funzionalità.
Nel classico VB6 esisteva solo la collezione tipizzata Collection. Con .NET sono apparse strutture più potenti, tra cui ArrayList (un vecchio tipo universale senza una rigorosa tipizzazione) e moderne collezioni generiche (Generic Collections) come List(Of T), introdotte in .NET 2.0.
La principale difficoltà è scegliere la collezione adatta per i requisiti del progetto. Le collezioni senza rigida tipizzazione (ArrayList, Collection) possono portare a errori di runtime o problemi di prestazioni. Le collezioni generiche richiedono parametrazione, ma offrono la massima sicurezza e facilità di lavoro con i tipi.
Utilizza la vecchia collezione Collection solo per interagire con codice obsoleto, mentre per i nuovi progetti privilegia List(Of T). La collezione ArrayList sarà utile solo quando non si conosce il tipo degli elementi, ma per questo è meglio usare List(Of Object) o altre collezioni generiche.
Esempio di codice:
' Collezione Dim coll As New Collection() coll.Add("Hello") coll.Add(123) ' ArrayList Dim arr As New ArrayList() arr.Add("World") arr.Add(456) ' List(Of T) Dim list As New List(Of Integer)() list.Add(789) list.Add(101112)
Caratteristiche chiave:
Qual è la differenza tra Collection e un array in Visual Basic?
Un array fissa la dimensione all'inizializzazione, memorizza elementi di un solo tipo e supporta un accesso rapido per indice. La Collection aumenta dinamicamente, può memorizzare oggetti di tipi diversi e supporta l'accesso tramite chiave (ma non indicizzabile in VB6).
Cosa succede se si cerca di aggiungere un oggetto con una chiave duplicata nella Collection?
Cercare di aggiungere un elemento con una chiave già esistente porterà a un errore di runtime "Key already exists in collection".
Dim c As New Collection() c.Add("one", "a") c.Add("two", "a") ' Errore
È possibile convertire un ArrayList in tipo List(Of T) nel modo standard?
No, la conversione normale non è possibile: sarà necessario creare manualmente un nuovo List(Of T) e copiare gli elementi compatibili, altrimenti si verificheranno errori di runtime a causa della non rigida tipizzazione di ArrayList.
In un progetto per la memorizzazione di clienti si utilizza ArrayList, dove per errore è stata aggiunta una stringa invece di un oggetto Client. Durante l'elaborazione si verifica un errore di cast di tipo, difficile da rintracciare.
Pro:
Contro:
Si utilizza una List(Of Client) rigorosamente tipizzata, tutto il codice viene compilato con l'opzione Strict On. Gli errori vengono rilevati in fase di compilazione, la struttura si espande facilmente con nuovi metodi LINQ.
Pro:
Contro: