Inicializadores de objeto: Nomeados e anônimos tipos (Visual Basic)

Inicializadores de objeto permitem que você especifique propriedades para um objeto complexo usando uma única expressão.Eles podem ser usados para criar instâncias de tipos nomeados e de tipos anônimos.

Declarações

Declarações de instâncias de tipos anônimos e nomeados podem parecer quase idênticas, mas seus efeitos não são iguais.Cada categoria tem capacidades e restrições de si próprio.O exemplo a seguir mostra uma maneira conveniente para declarar e inicializar uma instância de uma classe nomeada, Customer, usando uma lista de inicializador de objeto.Observe que o nome da classe está especificado após a palavra-chave New.

Dim namedCust = New Customer With {.Name = "Terry Adams"}

Um tipo anônimo não tem nenhum nome utilizável.Portanto, uma instanciação de um tipo anônimo não pode incluir um nome de classe.

Dim anonymousCust = New With {.Name = "Hugo Garcia"}

Os requisitos e os resultados das duas declarações não são os mesmos.Para namedCust, um Customer classe que tem um Name propriedade já deve existir e a declaração cria uma instância dessa classe.Para anonymousCust, o compilador define uma nova classe que tem uma propriedade, uma seqüência de caracteres denominada Namee cria uma nova instância dessa classe.

Tipos Nomeados

Inicializadores de objeto fornecem uma maneira simple para chamar o construtor de um tipo e, em seguida, defina os valores de algumas ou todas as propriedades em uma única instrução.O compilador invocará o construtor apropriado para a instrução: o construtor padrão se nenhum argumento é apresentado, ou um construtor parametrizado, se um ou mais argumentos forem enviados.Depois disso, as propriedades especificadas são inicializadas na ordem em que são apresentados na lista de inicializador.

Consiste em cada inicialização da lista do inicializador a atribuição de um valor inicial a um membro da classe.Os nomes e tipos de dados dos membros são determinados quando a classe é definida.Nos exemplos a seguir, o Customer classe deve existir e devem ter membros nomeados Name e City que pode aceitar valores de seqüência de caracteres.

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", 
                                           .City = "Louisville"}

Como alternativa, você pode obter o mesmo resultado usando o código a seguir:

Dim cust1 As New Customer With {.Name = "Toni Poe", 
                                .City = "Louisville"}

Cada uma dessas declarações é equivalente ao exemplo a seguir, que cria uma Customer de objeto usando o construtor padrão e, em seguida, especifica os valores iniciais para o Name e City propriedades usando um With instrução.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

Se a Customer classe contém um construtor parametrizado que permite que você envie um valor para Name, por exemplo, você pode também declarar e inicializar um Customer objeto das seguintes maneiras:

Dim cust3 As Customer = 
    New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}

Você não precisará inicializar todas as propriedades, como mostra o código a seguir.

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}

No entanto, a lista de inicialização não pode estar vazia.Propriedades não inicializadas mantêm seus valores padrão.

Bb385125.collapse_all(pt-br,VS.110).gifInferência de tipo com tipos nomeados

Você pode reduzir o código para a declaração de cust1 , combinando os inicializadores de objeto e a inferência de tipo local.Isso permite que você omita a As cláusula na declaração da variável.O tipo de dados da variável é inferido do tipo do objeto que é criado pela atribuição.No exemplo a seguir, o tipo de cust6 é Customer.

Dim cust6 = New Customer With {.Name = "Toni Poe", 
                               .City = "Louisville"}

Bb385125.collapse_all(pt-br,VS.110).gifComentários sobre tipos nomeados

  • Mais uma vez na lista de inicializador de objeto não é possível inicializar a um membro da classe.A declaração do cust7 causa um erro.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • Um membro pode ser usado para inicializar a mesmo ou em outro campo.Se um membro é acessado antes de ter sido inicializado, como na seguinte declaração para cust8, o valor padrão será usado.Lembre-se de que, quando uma declaração que usa um inicializador de objeto é processada, a primeira coisa que acontece é que o construtor apropriado é invocado.Depois disso, os campos individuais na lista de inicializador são inicializados.Nos exemplos a seguir, o valor padrão para Name é atribuído para cust8, e é atribuído um valor inicializado cust9.

    Dim cust8 = New Customer With {.Name = .Name & ", President"}
    Dim cust9 = New Customer With {.Name = "Toni Poe", 
                                   .Title = .Name & ", President"}
    

    O exemplo a seguir usa o construtor com parâmetros de cust3 e cust4 para declarar e inicializar cust10 e cust11.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • Inicializadores de objeto podem ser aninhados.No exemplo a seguir, AddressClass é uma classe que tem duas propriedades, City e Statee o Customer classe tem um Address propriedade que é uma instância de AddressClass.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • A lista de inicialização não pode estar vazia.

  • A instância que está sendo inicializada não pode ser do tipo Object.

  • Membros de classe que está sendo inicializados não podem ser membros compartilhados, os membros somente leitura, constantes ou chamadas de método.

  • Membros da classe que está sendo inicializados não podem ser indexados ou qualificados.Os exemplos a seguir elevar a erros do compilador:

    '' Not valid.

    ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}

    ' Dim c2 = New Customer with {.Address.City = "Springfield"}

Tipos Anônimos

Tipos anônimos usam inicializadores de objeto para criar instâncias dos novos tipos que você não definir explicitamente e nome.Em vez disso, o compilador gera um tipo de acordo com as propriedades que você designa na lista de inicializador de objeto.Porque o nome do tipo não for especificado, ele é conhecido como um tipo anônimo.Por exemplo, comparar a declaração a seguir à anterior do cust6.

Dim cust13 = New With {.Name = "Toni Poe", 
                       .City = "Louisville"}

Sintaticamente, a única diferença é que nenhum nome for especificada após New para o tipo de dados.No entanto, o que acontece é bem diferente.O compilador define um novo tipo anônimo com duas propriedades, Name e Citye cria uma instância com os valores especificados.Inferência de tipo determina os tipos de Name e City no exemplo seqüências de caracteres.

Observação de cuidadoCuidado

O nome do tipo anônimo é gerado pelo compilador e pode variar de compilação a compilação.Seu código não deve usar ou contar com o nome de um tipo anônimo.

Como o nome do tipo não estiver disponível, você não pode usar um As cláusula declarar cust13.Seu tipo deve ser inferido.Sem usar a ligação tardia, isso limita o uso de tipos anônimos para as variáveis locais.

Tipos anônimos fornecem suporte crítico para LINQ consultas.Para obter mais informações sobre o uso de tipos anônimos em consultas, consulte Tipos anônimos (Visual Basic) e Introdução ao LINQ em Visual Basic.

Bb385125.collapse_all(pt-br,VS.110).gifComentários sobre os tipos anônimos

  • Normalmente, todas ou a maioria das propriedades em uma declaração de tipo anônimo será propriedades de chave, que são indicadas ao digitar a palavra-chave Key na frente do nome da propriedade.

    
    Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", 
                                   Key .City = "Louisville"}
    

    Para mais informações sobre propriedades, veja Chave (Visual Basic).

  • Como o nome de tipos, listas de inicializador para definições de tipo anônimo devem declarar pelo menos uma propriedade.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • Quando uma instância de um tipo anônimo é declarada, o compilador gera uma definição de tipo anônimo correspondente.Os nomes e tipos de dados das propriedades são obtidos a partir da declaração de instância e são incluídos pelo compilador na definição.As propriedades não são denominadas e definidas com antecedência, como seriam para um tipo nomeado.Os tipos são inferidos.Você não pode especificar os tipos de dados das propriedades usando um As cláusula.

  • Tipos anônimos também podem estabelecer os nomes e valores de suas propriedades de várias outras maneiras.Por exemplo, a propriedade de uma tipo anônimo pode levar o nome e o valor de uma variável, ou o nome e valor de uma propriedade de outro objeto.

    ' Create a variable, Name, and give it an initial value.
    Dim Name = "Hugo Garcia"
    
    ' Variable anonymousCust2 will have one property, Name, with 
    ' "Hugo Garcia" as its initial value.
    Dim anonymousCust2 = New With {Key Name}
    
    ' The next declaration uses a property from namedCust, defined
    ' in an earlier example. After the declaration, anonymousCust3 will
    ' have one property, Name, with "Terry Adams" as its value.
    Dim anonymousCust3 = New With {Key namedCust.Name}
    

    Para obter mais informações sobre as opções para definir propriedades em tipos anônimos, consulte Como: inferir tipos em declarações de tipo anônimo (Visual Basic) e nomes de propriedade.

Consulte também

Tarefas

Como: inferir tipos em declarações de tipo anônimo (Visual Basic) e nomes de propriedade

Como: declarar um objeto usando um inicializador de objeto (Visual Basic)

Referência

Chave (Visual Basic)

Conceitos

Inferência de tipo de local (Visual Basic)

Tipos anônimos (Visual Basic)

Introdução ao LINQ em Visual Basic