Partilhar via


Inicializadores de objeto: Tipos nomeados e anônimos (Visual Basic)

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

Declarations

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 classenomeada, Customer, usando uma lista de inicializador de objeto . Observe que o nome da classe é especificado após a palavra-chave New.

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

Um tipo anônimo não tem utilizável nome. 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 de 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.

Named Types

Inicializadores de objeto fornecem uma maneira simples de chamar o construtor de um tipo e defina os valores das propriedades de alguns ou todos em uma única demonstrativo. O compilador invocará o construtor apropriado para a demonstrativo: o padrão construtor se nenhum argumento é apresentado ou um parametrizado construtor se um ou mais argumentos forem enviados. Depois disso, as propriedades especificadas são inicializadas na ordem em que são apresentados na lista do 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 nomeado 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 seguinte exemplo cria um Customeroobjeto usando o construtordo padrão e especifica valores iniciais para o Name e City propriedades usando um Withdemonstrativo.

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

Se o Customerclasse contém parametrizado construtor que lhe permite enviar um valor para Name, por exemplo, você pode também declarar e inicializar um Customeroobjeto 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"}

Não é necessário 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.

Tipo Inferência de tipos nomeados

Você pode encurtar o código para a declaração de cust1 inferência. Isso permite que você omita a As cláusula nadeclaraçãode variável. O tipo de dados da variável é inferido do tipo de 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"}

Comentários sobre os tipos nomeados

  • Mais uma vez na lista de inicializador de objeto não pode ser inicializado a um membro da classe . A declaração de 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 ele ter sido inicializado, como na seguinte declaração para cust8, será usado o valor padrão . 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 do 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 parametrizado 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 Customerclasse tem um Addressapropriedade 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.

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

  • Os membros de 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"}

Anonymous Types

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ê designar 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 seguinte declaração à anterior para 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 que tem duas propriedades, Name e Citye cria uma instância com os valores especificados. Tipo inferência determina os tipos de Name e City no exemplo para ser seqüências de caracteres.

Aviso

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 confiar no nome de um tipo anônimo.

Como o nome do tipo não estiver disponível, é possível usar um As cláusula declarar cust13. Its type must be inferred. 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 no Visual Basic.

Comentários sobre os tipos anônimos

  • Normalmente, todos ou a maioria das propriedades em umadeclaração de tipo anônimoserá propriedades de chave , o que são indicadas ao digitar a palavra-chaveKey na frente do nome de propriedade .

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

    For more information about key properties, see Key (Visual Basic).

  • Tipos, listas de inicializador como nomeados para tipo anônimo definições 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çãode 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, umapropriedade do tipo anônimopode 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 nomes e tipos de propriedade em declarações de tipo anônimo (Visual Basic).

Consulte também

Tarefas

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

Como: Declarar uma instância de um tipo anônimo (Visual Basic)

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

Referência

Key (Visual Basic)

Conceitos

Inferência de tipo de variável local (Visual Basic)

Tipos anônimos (Visual Basic)

Introdução ao LINQ no Visual Basic

Comparação de tipos nomeados e anônimos (Visual Basic)