Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Tipos anónimos fornecem uma forma conveniente de encapsular um conjunto de propriedades de apenas leitura num único objeto sem definir primeiro um tipo nomeado. O compilador gera um nome de tipo em tempo de compilação ao qual não pode aceder no seu código-fonte. O compilador infere o tipo de cada propriedade.
Crie tipos anónimos usando o new operador juntamente com um inicializador de objetos. O exemplo seguinte mostra um tipo anónimo inicializado com duas propriedades, Name e Age:
var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.
Nomes de propriedades inferidos
Podes especificar nomes de propriedades explicitamente usando a Name = value sintaxe. Quando inicializa um tipo anónimo com uma variável ou expressão de acesso a membros, o compilador infere o nome da propriedade a partir dessa expressão:
string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99
No exemplo anterior, o compilador infere productName e price como os nomes das propriedades a partir dos nomes das variáveis usadas no inicializador.
Declarar tipos anónimos com var
Como o compilador gera o nome do tipo e não consegues aceder a ele no código-fonte, tens de usar var para declarar a variável local. Não pode especificar explicitamente o nome do tipo:
// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };
Use tipos anónimos em consultas LINQ
Tipos anónimos aparecem mais frequentemente na select cláusula de uma expressão de consulta, onde projetam um subconjunto de propriedades de cada elemento fonte:
var words = new[] { "apple", "blueberry", "cherry" };
var results = words.Select(w => new { Word = w, Length = w.Length });
foreach (var item in results)
{
Console.WriteLine($"{item.Word} has {item.Length} letters.");
}
// Output:
// apple has 5 letters.
// blueberry has 9 letters.
// cherry has 6 letters.
Igualdade
Duas instâncias anónimas de tipos que têm os mesmos nomes de propriedades e tipos na mesma ordem partilham o mesmo tipo gerado pelo compilador. O compilador sobrescreve Equals e GetHashCode para que a igualdade compare os valores das propriedades em vez da identidade de referência:
var a = new { Name = "Alice", Age = 30 };
var b = new { Name = "Alice", Age = 30 };
var c = new { Name = "Bob", Age = 25 };
Console.WriteLine(a.Equals(b)); // True
Console.WriteLine(a.Equals(c)); // False
Tipos anónimos aninhados
Tipos anónimos podem conter outros tipos anónimos como valores de propriedades:
var order = new
{
OrderId = 1,
Customer = new { Name = "Alice", City = "Seattle" },
Total = 150.00m
};
Console.WriteLine($"Order {order.OrderId} for {order.Customer.Name} in {order.Customer.City}");
// Output:
// Order 1 for Alice in Seattle
Caraterísticas
Os tipos anónimos têm as seguintes características:
- O compilador gera-as como
internal sealed classtipos que derivam de Object. - Todas as propriedades são
publicsomente de leitura. - Tipos anónimos suportam
withexpressões para mutação não destrutiva. - O compilador gera substituições baseadas em valores Equals, GetHashCode e ToString.
- Os tipos anónimos suportam árvores de expressão, enquanto as tuplas não.
Limitações
Os tipos anónimos têm várias limitações:
- Não podes usá-los como tipos de retorno de métodos, parâmetros de método ou tipos de campo porque não podes nomear o tipo.
- Estão ajustadas ao método onde as declaras.
- Não podes adicionar métodos, eventos ou operadores personalizados.
- As propriedades são sempre de apenas leitura; Os tipos anónimos não suportam propriedades mutáveis.
Quando usar tuplas em vez disso
Para a maioria dos novos códigos, considere usar tuplas em vez de tipos anónimos. Como tipos de valor, as tuplas oferecem melhor desempenho. Também fornecem apoio à desconstrução e uma sintaxe mais flexível. Os tipos anónimos continuam a ser a melhor escolha quando precisas de suporte para árvore de expressões ou semântica de tipos de referência. Para uma comparação detalhada, veja Escolher entre tipos anónimos e tipos de tuplas.