Tipos anónimos (Guía de programación de C#)Anonymous Types (C# Programming Guide)

Los tipos anónimos son una manera cómoda de encapsular un conjunto de propiedades de solo lectura en un único objeto sin tener que definir primero un tipo explícitamente.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. El compilador genera el nombre del tipo y no está disponible en el nivel de código fuente.The type name is generated by the compiler and is not available at the source code level. El compilador deduce el tipo de cada propiedad.The type of each property is inferred by the compiler.

Para crear tipos anónimos, use el operador new con un inicializador de objeto.You create anonymous types by using the new operator together with an object initializer. Para obtener más información sobre los inicializadores de objeto, vea Inicializadores de objeto y colección (Guía de programación de C#).For more information about object initializers, see Object and Collection Initializers.

En el ejemplo siguiente se muestra un tipo anónimo que se inicializa con dos propiedades llamadas Amount y 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);  

Los tipos anónimos suelen usarse en la cláusula select de una expresión de consulta para devolver un subconjunto de las propiedades de cada objeto en la secuencia de origen.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 obtener más información sobre consultas, vea Expresiones de consulta LINQ.For more information about queries, see LINQ Query Expressions.

Los tipos anónimos contienen una o varias propiedades públicas de solo lectura.Anonymous types contain one or more public read-only properties. No es válido ningún otro tipo de miembros de clase, como métodos o eventos.No other kinds of class members, such as methods or events, are valid. La expresión que se usa para inicializar una propiedad no puede ser null, una función anónima o un tipo de puntero.The expression that is used to initialize a property cannot be null, an anonymous function, or a pointer type.

El escenario más habitual es inicializar un tipo anónimo con propiedades de otro tipo.The most common scenario is to initialize an anonymous type with properties from another type. En el siguiente ejemplo, se da por hecho que existe una clase con el nombre Product.In the following example, assume that a class exists that is named Product. La clase Product incluye las propiedades Color y Price, junto con otras propiedades que no son de su interés.Class Product includes Color and Price properties, together with other properties that you are not interested in. La variable products es una colección de objetos Product.Variable products is a collection of Product objects. La declaración de tipo anónimo comienza con la palabra clave new.The anonymous type declaration starts with the new keyword. La declaración inicializa un nuevo tipo que solo usa dos propiedades de Product.The declaration initializes a new type that uses only two properties from Product. Esto hace que la consulta devuelva una cantidad de datos menor.This causes a smaller amount of data to be returned in the query.

Si no especifica los nombres de miembro en el tipo anónimo, el compilador da a los miembros de tipo anónimo el mismo nombre que la propiedad que se usa para inicializarlos.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. Debe proporcionar un nombre para una propiedad que se está inicializando con una expresión, como se muestra en el ejemplo anterior.You must provide a name for a property that is being initialized with an expression, as shown in the previous example. En el siguiente ejemplo, los nombres de las propiedades del tipo anónimo son Color y 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, cuando se usa un tipo anónimo para inicializar una variable, la variable se declara como variable local con tipo implícito mediante 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. El nombre del tipo no se puede especificar en la declaración de la variable porque solo el compilador tiene acceso al nombre subyacente del 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 obtener más información sobre var, vea Variables locales con asignación implícita de tipos.For more information about var, see Implicitly Typed Local Variables.

Puede crear una matriz de elementos con tipo anónimo combinando una variable local con tipo implícito y una matriz con tipo implícito, como se muestra en el ejemplo siguiente.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 }};  

ComentariosRemarks

Los tipos anónimos son tipos class que derivan directamente de object y que no se pueden convertir a ningún tipo excepto object.Anonymous types are class types that derive directly from object, and that cannot be cast to any type except object. El compilador proporciona un nombre para cada tipo anónimo, aunque la aplicación no pueda acceder a él.The compiler provides a name for each anonymous type, although your application cannot access it. Desde el punto de vista de Common Language Runtime, un tipo anónimo no es diferente de otros tipos de referencia.From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

Si dos o más inicializadores de objeto anónimo en un ensamblado especifican una secuencia de propiedades que están en el mismo orden y que tienen los mismos nombres y tipos, el compilador trata el objeto como instancias del mismo 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. Comparten la misma información de tipo generada por el compilador.They share the same compiler-generated type information.

No se puede declarar que un campo, una propiedad, un evento o el tipo de valor devuelto de un método tengan un tipo anónimo.You cannot declare a field, a property, an event, or the return type of a method as having an anonymous type. De forma similar, no se puede declarar que un parámetro formal de un método, propiedad, constructor o indizador tenga un tipo anónimo.Similarly, you cannot declare a formal parameter of a method, property, constructor, or indexer as having an anonymous type. Para pasar un tipo anónimo, o una colección que contiene tipos anónimos, como un argumento a un método, puede declarar el parámetro como objeto de tipo.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. Sin embargo, al hacerlo se invalida el propósito del tipado fuerte.However, doing this defeats the purpose of strong typing. Si tiene que almacenar resultados de consulta o pasarlos fuera del límite del método, considere la posibilidad de usar un struct o una clase con nombre normal en lugar de un 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 los métodos Equals y GetHashCode de tipos anónimos se definen en términos de los métodos Equals y GetHashCode de las propiedades, dos instancias del mismo tipo anónimo son iguales solo si todas sus propiedades son iguales.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.

Vea tambiénSee Also

Guía de programación de C#C# Programming Guide
Inicializadores de objeto y colecciónObject and Collection Initializers
Introducción a LINQ en C#Getting Started with LINQ in C#
Expresiones de consulta LINQLINQ Query Expressions