Inizializzatori di raccolta (Visual Basic)
Gli inizializzatori di insieme consentono di creare una raccolta e popolarla con un set iniziale di valori. Gli inizializzatori di insieme sono utili quando si crea una raccolta da un set di valori noti, ad esempio un elenco di opzioni di menu o categorie, un set iniziale di valori numerici, un elenco statico di stringhe quali nomi di giorni o mesi o un elenco di aree geografiche, ad esempio un elenco di stati che viene usato per la convalida.
Per altre informazioni sulle raccolte, vedere Raccolte.
È possibile identificare un inizializzatore di insieme usando la parola chiave From
seguita da parentesi graffe ({}
). Questo approccio è simile alla sintassi dei valori letterali di matrice, descritta in Matrici. Gli esempi seguenti illustrano diversi metodi d'uso degli inizializzatori di insieme per la creazione di raccolte.
' Create an array of type String().
Dim winterMonths = {"December", "January", "February"}
' Create an array of type Integer()
Dim numbers = {1, 2, 3, 4, 5}
' Create a list of menu options. (Requires an extension method
' named Add for List(Of MenuOption)
Dim menuOptions = New List(Of MenuOption) From {{1, "Home"},
{2, "Products"},
{3, "News"},
{4, "Contact Us"}}
Nota
Anche C# offre inizializzatori di insieme. Gli inizializzatori di insieme di C# offrono la stessa funzionalità degli inizializzatori di insieme di Visual Basic. Per altre informazioni sugli inizializzatori di insieme di C#, vedere Inizializzatori di oggetto e di insieme.
Sintassi
Un inizializzatore di insieme è costituito da un elenco di valori delimitati da virgole racchiusi tra parentesi graffe ({}
) e preceduti dalla parola chiave From
come illustrato nel codice seguente.
Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}
Quando si crea una raccolta, ad esempio List<T> o Dictionary<TKey,TValue>, è necessario specificare il tipo di raccolta prima dell'inizializzatore di insieme, come illustrato nel codice seguente.
Public Class AppMenu
Public Property Items As List(Of String) =
New List(Of String) From {"Home", "About", "Contact"}
End Class
Nota
È possibile combinare un inizializzatore di insieme e un inizializzatore di oggetto per inizializzare lo stesso oggetto raccolta. È possibile usare gli inizializzatori di oggetto per inizializzare oggetti in un inizializzatore di insieme.
Creazione di una raccolta tramite un inizializzatore di raccolta
Quando si crea una raccolta usando un inizializzatore di insieme, ogni valore specificato nell'inizializzatore di insieme viene passato al metodo Add
appropriato della raccolta. Se ad esempio si crea un List<T> usando un inizializzatore di insieme, ogni valore stringa nell'inizializzatore di insieme viene passato al metodo Add. Se si vuole creare una raccolta usando un inizializzatore di insieme, il tipo specificato deve essere un tipo di raccolta valido. Sono esempi di tipi di raccolta validi le classi che implementano l'interfaccia IEnumerable<T> o ereditano la classe CollectionBase. Il tipo specificato deve anche esporre un metodo Add
che soddisfa i criteri seguenti.
Il metodo
Add
deve essere disponibile dall'ambito in cui viene chiamato l'inizializzatore di insieme. Non è necessario che il metodoAdd
sia pubblico se l'inizializzatore di insieme è usato in uno scenario in cui è possibile accedere a metodi non pubblici della raccolta.Il metodo
Add
deve essere un membro di istanza o un membroShared
della classe di raccolta oppure un metodo di estensione.Deve esistere un metodo
Add
che può corrispondere ai tipi specificati nell'inizializzatore di insieme, in base alle regole di risoluzione dell'overload.
Il codice di esempio seguente illustra come creare una raccolta List(Of Customer)
usando un inizializzatore di insieme. Quando il codice viene eseguito ogni oggetto Customer
viene passato al metodo Add(Customer)
dell'elenco generico.
Dim customers = New List(Of Customer) From
{
New Customer("City Power & Light", "http://www.cpandl.com/"),
New Customer("Wide World Importers", "http://www.wideworldimporters.com/"),
New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/")
}
L'esempio di codice seguente visualizza codice equivalente che non usa un inizializzatore di insieme.
Dim customers = New List(Of Customer)
customers.Add(New Customer("City Power & Light", "http://www.cpandl.com/"))
customers.Add(New Customer("Wide World Importers", "http://www.wideworldimporters.com/"))
customers.Add(New Customer("Lucerne Publishing", "http://www.lucernepublishing.com/"))
Se la raccolta ha un metodo Add
con parametri che corrispondono al costruttore dell'oggetto Customer
è possibile nidificare i valori dei parametri per il metodo Add
all'interno di inizializzatori di insieme, come descritto nella sezione successiva. Se la raccolta non dispone di tale metodo Add
è possibile crearne uno come metodo di estensione. Per un esempio di creazione di un metodo Add
come metodo di estensione per una raccolta, vedere Procedura: Creare un metodo di estensione Add usato da un inizializzatore di insieme. Per un esempio di creazione di una raccolta personalizzata che può essere usata con un inizializzatore di insieme, vedere Procedura: Creare una raccolta usata da un inizializzatore di insieme.
Annidamento di inizializzatori di insieme
È possibile annidare valori in un inizializzatore di insieme per identificare un overload specifico di un metodo Add
per la raccolta che viene creata. I valori passati al metodo Add
devono essere separati da virgole e racchiusi tra parentesi graffe ({}
), come nella sintassi di un valore letterale di matrice o di un inizializzatore di insieme.
Quando si crea una raccolta usando valori annidati ogni elemento dell'elenco di valori annidati viene passato come argomento al metodo Add
, che corrisponde ai tipi di elemento. Ad esempio il codice seguente crea un Dictionary<TKey,TValue> in cui le chiavi sono di tipo Integer
e i valori sono di tipo String
. Ogni elenco di valori annidati viene associato al metodo Add per Dictionary
.
Dim days = New Dictionary(Of Integer, String) From
{{0, "Sunday"}, {1, "Monday"}}
Il codice dell'esempio precedente equivale al seguente codice.
Dim days = New Dictionary(Of Integer, String)
days.Add(0, "Sunday")
days.Add(1, "Monday")
Solo gli elenchi di valori annidati al primo livello di annidamento vengono inviati al metodo Add
per il tipo di raccolta. I livelli di annidamento più profondi vengono considerati come valori letterali di matrice e gli elenchi di valori annidati non vengono associati al metodo Add
di una raccolta.
Argomenti correlati
Titolo | Descrizione |
---|---|
Procedura: creare un metodo di estensione Add utilizzato da un inizializzatore di raccolta | Illustra come creare un metodo di estensione denominato Add che può essere usato per popolare una raccolta con valori di un inizializzatore di insieme. |
Procedura: Creare una raccolta usata da un inizializzatore di raccolta | Illustra come abilitare l'uso di un inizializzatore di insieme includendo un metodo Add in una classe di raccolte che implementa IEnumerable . |
Vedi anche
- raccolte
- Matrici
- Inizializzatori di oggetto: tipi denominati e tipi anonimi
- Nuovo operatore
- Proprietà implementate automaticamente
- Procedura: Inizializzare una variabile di matrice in Visual Basic
- Inferenza del tipo di variabile locale
- Tipi anonimi
- Introduzione a LINQ in Visual Basic
- Procedura: Creare un elenco di elementi