Inicializadores de objeto: Tipos nomeados e anônimo
Os 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ônimo.
Declarações
Declarações de instâncias de tipos nomeados e anônimas podem parecer quase idênticas, mas seus efeitos não são iguais.Cada categoria tem capacidades e restrições de seu próprio.O exemplo a seguir mostra uma maneira conveniente de declarar e inicializar uma instância de uma classe nomeada, Customer, usando uma lista do 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 das declarações de dois não são iguais.For namedCust, um Customer classe que tenha um Name propriedade já deve existir e a declaração cria uma ocorrência dessa classe. For 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
Os inicializadores de objeto fornecem uma maneira simples chama o construtor de tipo e, em seguida, conjunto os valores de algumas ou todas as propriedades em uma única demonstrativo.O compilador chama o construtor apropriado para a demonstrativo: o construtor padrão se nenhum argumento é apresentado, ou um construtor com parâmetros 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.
Cada inicialização da lista do inicializador consiste 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.Os exemplos a seguir, a 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 um Customer objeto usando o construtor padrão e, em seguida, especifica valores iniciais para o Name e City propriedades usando um With demonstrativo.
Dim cust2 As New Customer()
With cust2
.Name = "Toni Poe"
.City = "Louisville"
End With
Se o Customer classe contém um construtor com parâmetros que permite o enviar de um valor para Name, por exemplo, você também pode declarar e inicializar um Customer objeto da seguinte forma:
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 sistema autônomo propriedades, sistema autônomo 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 retêm seus valores padrão.
inferência de tipos de tipos com tipos nomeados
Você pode encurtar o código para a declaração de cust1 Combinando os inicializadores de objeto e inferência de tipos de tipos local. Dessa forma, você pode omitir o As cláusula na declaração da 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 tipos nomeados
Um membro da classe não é possível inicializar mais de uma vez na lista de inicializador de objeto.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 propriamente dito ou outro campo.Se um membro é acessado antes de ele tiver sido inicializado, sistema autônomo na seguinte declaração de 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.Os exemplos a seguir, o valor padrão de 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 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"}
Os 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 ficar vazia.
A instância que está sendo inicializada não pode ser do tipo objeto.
Membros da 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 totalmente 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ônimo usam inicializadores de objeto para criar instâncias de 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.sistema autônomo o nome do tipo não é especificado, ele é conhecido sistema autônomo um tipo anônimo.Por exemplo, comparar a declaração a seguir para aquele anterior do cust6.
Dim cust13 = New With {.Name = "Toni Poe", _
.City = "Louisville"}
A única diferença é sintaticamente 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 dela com os valores especificados. inferência de tipos de tipos determina os tipos de Name e City no exemplo a ser cadeias de caracteres.
Cuidado: |
---|
O nome do anônimo type 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, não é possível usar um As cláusula para declarar cust13. Seu tipo deve ser inferido.Sem o uso de associação tardia, isso limita o uso de tipos anônimo para as variáveis locais.
Tipos anônimo fornecem suporte crítico para LINQ consultas. Para obter mais informações sobre o uso de tipos anônimo em consultas, consulte Tipos anônimos e Introdução ao LINQ no Visual Basic.
Comentários sobre tipos anônimo
Normalmente, todas ou a maioria das propriedades em uma declaração de tipo anônimo será propriedades-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 Key (Visual Basic).
Nomeado como tipos de 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 for declarada, o compilador gera uma definição de tipo anônimo correspondente.Os nomes e tipos de dados das propriedades são tirados da declaração da instância e são incluídos pelo compilador na definição.sistema autônomo propriedades não são nomeadas e definidas antecipadamente, sistema autônomo 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ônimo também podem estabelecer os nomes e valores de suas propriedades de várias outras maneiras.A propriedade de tipo anônimo pode demorar, por exemplo, 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ônimo, consulte Como: Inferir tipos na declaração de tipo anônimo e nomes de propriedade.
Consulte também
Tarefas
Como: Inferir tipos na declaração de tipo anônimo e nomes de propriedade
Como: Declare uma instância de um tipo anônimo
Como: Declare um objeto por meio de um inicializador de objeto
Conceitos
Introdução ao LINQ no Visual Basic
Comparação de tipos nomeados e anônimos