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 metodo Add 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 membro Shared 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.

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