Tipos anônimos (Guia de Programação em C#)Anonymous Types (C# Programming Guide)

Os tipos anônimos fornecem um modo conveniente de encapsular um conjunto de propriedades somente leitura em um único objeto sem a necessidade de primeiro definir explicitamente um tipo.Anonymous types provide a convenient way to encapsulate a set of read-only properties into a single object without having to explicitly define a type first. O nome do tipo é gerado pelo compilador e não está disponível no nível do código-fonte.The type name is generated by the compiler and is not available at the source code level. O tipo de cada propriedade é inferido pelo compilador.The type of each property is inferred by the compiler.

Crie tipos anônimos, usando o operador new com um inicializador de objeto.You create anonymous types by using the new operator together with an object initializer. Para obter mais informações sobre inicializadores de objeto, consulte Inicializadores de Objeto e Coleção.For more information about object initializers, see Object and Collection Initializers.

O exemplo a seguir mostra um tipo anônimo que é inicializado com duas propriedades chamadas Amount e Message.The following example shows an anonymous type that is initialized with two properties named Amount and Message.

var v = new { Amount = 108, Message = "Hello" };  

// Rest the mouse pointer over v.Amount and v.Message in the following  
// statement to verify that their inferred types are int and string.  
Console.WriteLine(v.Amount + v.Message);  

Os tipos anônimos são normalmente usados na cláusula select de uma expressão de consulta para retornar um subconjunto das propriedades de cada objeto na sequência de origem.Anonymous types typically are used in the select clause of a query expression to return a subset of the properties from each object in the source sequence. Para obter mais informações sobre consultas, consulte Expressões de Consulta LINQ.For more information about queries, see LINQ Query Expressions.

Os tipos anônimos contêm uma ou mais propriedades públicas somente leitura.Anonymous types contain one or more public read-only properties. Nenhum outro tipo de membros da classe, como métodos ou eventos, é válido.No other kinds of class members, such as methods or events, are valid. A expressão que é usada para inicializar uma propriedade não pode ser null, uma função anônima ou um tipo de ponteiro.The expression that is used to initialize a property cannot be null, an anonymous function, or a pointer type.

O cenário mais comum é inicializar um tipo anônimo com propriedades de outro tipo.The most common scenario is to initialize an anonymous type with properties from another type. No exemplo a seguir, suponha que existe uma classe com o nome Product.In the following example, assume that a class exists that is named Product. A classe Product inclui as propriedades Color e Price, além de outras propriedades que não lhe interessam.Class Product includes Color and Price properties, together with other properties that you are not interested in. A variável products é uma coleção de objetos do Product.Variable products is a collection of Product objects. A declaração do tipo anônimo começa com a palavra-chave new.The anonymous type declaration starts with the new keyword. A declaração inicializa um novo tipo que usa apenas duas propriedades de Product.The declaration initializes a new type that uses only two properties from Product. Isso faz com que uma menor quantidade de dados seja retornada na consulta.This causes a smaller amount of data to be returned in the query.

Quando você não especifica os nomes de membros no tipo anônimo, o compilador dá aos membros de tipo anônimo o mesmo nome da propriedade que está sendo usada para inicializá-los.If you do not specify member names in the anonymous type, the compiler gives the anonymous type members the same name as the property being used to initialize them. Forneça um nome para a propriedade que está sendo inicializada com uma expressão, como mostrado no exemplo anterior.You must provide a name for a property that is being initialized with an expression, as shown in the previous example. No exemplo a seguir, os nomes das propriedades do tipo anônimo são Color e Price .In the following example, the names of the properties of the anonymous type are Color and Price.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Normalmente, ao usar um tipo anônimo para inicializar uma variável, a variável é declarada como uma variável local de tipo implícito usando var.Typically, when you use an anonymous type to initialize a variable, you declare the variable as an implicitly typed local variable by using var. O nome do tipo não pode ser especificado na declaração da variável, porque apenas o compilador tem acesso ao nome subjacente do tipo anônimo.The type name cannot be specified in the variable declaration because only the compiler has access to the underlying name of the anonymous type. Para obter mais informações sobre var, consulte Variáveis de local digitadas implicitamente.For more information about var, see Implicitly Typed Local Variables.

Você pode criar uma matriz de elementos de tipo anônimo combinando uma variável local de tipo implícito e uma matriz de tipo implícito, como mostrado no exemplo a seguir.You can create an array of anonymously typed elements by combining an implicitly typed local variable and an implicitly typed array, as shown in the following example.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};  

ComentáriosRemarks

Os tipos anônimos são tipos class que derivam diretamente de object e que não podem ser convertidos para qualquer tipo, exceto object.Anonymous types are class types that derive directly from object, and that cannot be cast to any type except object. O compilador fornece um nome para cada tipo anônimo, embora o seu aplicativo não possa acessá-lo.The compiler provides a name for each anonymous type, although your application cannot access it. Do ponto de vista do Common Language Runtime, um tipo anônimo não é diferente de qualquer outro tipo de referência.From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

Se dois ou mais inicializadores de objeto anônimos em um assembly especificarem uma sequência de propriedades que estão na mesma ordem e que têm os mesmos nomes e tipos, o compilador tratará os objetos como instâncias do mesmo tipo.If two or more anonymous object initializers in an assembly specify a sequence of properties that are in the same order and that have the same names and types, the compiler treats the objects as instances of the same type. Eles compartilham o mesmo tipo de informação gerado pelo compilador.They share the same compiler-generated type information.

Você não pode declarar que um campo, uma propriedade, um evento ou um tipo de retorno de um método tem um tipo anônimo.You cannot declare a field, a property, an event, or the return type of a method as having an anonymous type. Da mesma forma, não pode declarar que um parâmetro formal de um método, propriedade, construtor ou indexador tem um tipo anônimo.Similarly, you cannot declare a formal parameter of a method, property, constructor, or indexer as having an anonymous type. Para passar um tipo anônimo ou uma coleção que contenha tipos anônimos, como um argumento para um método, você pode declarar o parâmetro como objeto type.To pass an anonymous type, or a collection that contains anonymous types, as an argument to a method, you can declare the parameter as type object. No entanto, isso anula a finalidade dos tipos fortes.However, doing this defeats the purpose of strong typing. Se você precisa armazenar os resultados da consulta ou passá-los fora do limite do método, considere o uso de uma estrutura ou classe com denominação comum em vez de um tipo anônimo.If you must store query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

Como os métodos Equals e GetHashCode em tipos anônimos são definidos em termos dos métodos das propriedades Equals e GetHashCode, duas instâncias do mesmo tipo anônimo são iguais somente se todas as suas propriedades forem iguais.Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

Consulte tambémSee Also