Inicializadores de coleção (Visual Basic)

Os inicializadores de coleção fornecem uma sintaxe abreviada que permite criar uma coleção e preenchê-la com um conjunto inicial de valores. Os inicializadores de coleção são úteis quando você está criando uma coleção de um conjunto de valores conhecidos, por exemplo, uma lista de opções de menu ou de categorias, um conjunto inicial de valores numéricos, uma lista estática de cadeias de caracteres, como nomes de mês ou de dias, ou localizações geográficas, como uma lista de estados usada para validação.

Para obter mais informações sobre coleções, consulte Coleções.

Você identificará um inicializador de coleção usando a palavra-chave From seguida por chaves ({}). Isso é semelhante à sintaxe de literal de matriz descrita em Matrizes. Os exemplos a seguir mostram várias maneiras de usar inicializadores de coleção para criar coleções.

' 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"}}

Observação

O C# também fornece inicializadores de coleção. Os inicializadores de coleção C# fornecem a mesma funcionalidade que a dos inicializadores de coleção do Visual Basic. Para obter mais informações sobre os inicializadores de coleção do C#, consulte Inicializadores de objeto e de coleção.

Syntax

Um inicializador de coleção consiste em uma lista de valores separados por vírgula colocados entre chaves ({}), precedidos pela palavra-chave From, conforme mostrado no código a seguir.

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}

Ao criar uma coleção, como uma List<T> ou uma Dictionary<TKey,TValue>, você deverá fornecer o tipo de coleção antes do inicializador de coleção, conforme mostrado no código a seguir.

Public Class AppMenu
    Public Property Items As List(Of String) =
        New List(Of String) From {"Home", "About", "Contact"}
End Class

Observação

Você não pode combinar um inicializador de coleção com um inicializador de objeto para inicializar o mesmo objeto de coleção. Você pode usar os inicializadores de objeto para inicializar objetos em um inicializador de coleção.

Criando uma coleção usando um inicializador de coleção

Ao criar uma coleção usando um inicializador de coleção, todo valor fornecido no inicializador de coleção será passado ao método Add apropriado da coleção. Por exemplo, se você criar uma List<T> usando um inicializador de coleção, todo valor de cadeia de caracteres no inicializador de coleção será passado ao método Add. Se desejar criar uma coleção usando um inicializador de coleção, o tipo especificado deverá ser um tipo de coleção válido. Os exemplos de tipos de coleção válidos incluem as classes que implementam a interface IEnumerable<T> ou que herdam a classe CollectionBase. O tipo especificado também deve expor um método Add que atenda aos seguintes critérios.

  • O método Add deve estar disponível no escopo em que o inicializador de coleção está sendo chamado. Se você estiver usando o inicializador de coleção em um cenário no qual os métodos não públicos da coleção possam ser acessados, o método Add não precisará ser público.

  • O método Add deve ser um membro de instância ou um membro Shared da classe da coleção ou um método de extensão.

  • Um método Add que possa ser correspondido deve existir, com base nas regras de resolução de sobrecarga, para os tipos fornecidos no inicializador de coleção.

Por exemplo, o exemplo de código a seguir mostra como criar uma coleção List(Of Customer) usando um inicializador de coleção. Quando o código for executado, todo objeto Customer será passado ao método Add(Customer) da lista genérica.

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/")
    }

O exemplo de código a seguir mostra o código equivalente que não usa um inicializador de coleção.

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 a coleção tiver um método Add com parâmetros correspondentes ao construtor do objeto Customer, você poderá aninhar os valores de parâmetro do método Add nos inicializadores de coleção, conforme será discutido na próxima seção. Se a coleção não tiver um método Add, você poderá criar um como um método de extensão. Para obter um exemplo de como criar um método Add como um método de extensão para uma coleção, consulte Como criar um método de extensão Add usado por um inicializador de coleção. Para obter um exemplo de como criar uma coleção personalizada que pode ser usada com um inicializador de coleção, consulte Como criar uma coleção usada por um inicializador de coleção.

Aninhando inicializadores de coleção

Você pode aninhar valores em um inicializador de coleção para identificar uma sobrecarga específica de um método Add para a coleção que está sendo criada. Os valores passados ao método Add devem ser separados por vírgula e colocados entre chaves ({}), como você faria em uma literal de matriz ou em um inicializador de coleção.

Ao criar uma coleção usando valores aninhados, todo elemento da lista de valores aninhados é passado como um argumento ao método Add correspondente aos tipos de elemento. Por exemplo, o exemplo de código a seguir cria um Dictionary<TKey,TValue> em que as chaves são do tipo Integer e os valores, do tipo String. Cada uma das listas de valores aninhados corresponde ao método Add do Dictionary.

Dim days = New Dictionary(Of Integer, String) From
    {{0, "Sunday"}, {1, "Monday"}}

O exemplo de código anterior é equivalente ao seguinte código.

Dim days = New Dictionary(Of Integer, String)
days.Add(0, "Sunday")
days.Add(1, "Monday")

Somente as listas de valores aninhados do primeiro nível de aninhamento são enviadas ao método Add do tipo de coleção. Níveis de aninhamento mais profundos são tratados como literais de matriz e as listas de valores aninhados não correspondem ao método Add de nenhuma coleção.

Título Descrição
Como criar um método para adicionar extensão usado por um inicializador de coleção Mostra como criar um método de extensão chamado Add, que pode ser usado para preencher uma coleção com valores de um inicializador de coleção.
Como criar uma coleção usada por um inicializador de coleção Mostra como habilitar o uso de um inicializador de coleção, incluindo um método Add em uma classe de coleção que implementa IEnumerable.

Confira também