Tipos anónimos (Guía de programación de C#)

Actualización: Julio de 2008

Los tipos anónimos ofrecen un modo útil de encapsular un conjunto de propiedades de sólo lectura en un único objeto sin tener que definir antes un tipo de forma explícita. El compilador genera el nombre de tipo y no está disponible en el nivel de código fuente. El compilador deduce el tipo de las propiedades. En el ejemplo siguiente se muestra un tipo anónimo que se inicializa con dos propiedades denominadas Amount y Message.

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

Normalmente, los tipos anónimos se utilizan en la cláusula select de una expresión de consulta para devolver un subconjunto de las propiedades de cada objeto de la secuencia de origen. Para obtener más información sobre consultas, vea Expresiones de consultas con LINQ (Guía de programación de C#).

Los tipos anónimos se crean utilizando el operador new con un inicializador de objeto. Para obtener más información sobre los inicializadores de objeto, vea Inicializadores de objeto y de colección (Guía de programación de C#).

Los tipos anónimos son tipos class que constan de una o más propiedades públicas de sólo lectura. No se permite ningún otro tipo de miembros de clase, como métodos o eventos. Un tipo anónimo no se puede convertir a ningún interfaz ni tipo salvo a object.

El escenario más común consiste en inicializar un tipo anónimo con algunas propiedades de otro tipo. En el ejemplo siguiente se utiliza una clase denominada Product que incluye las propiedades Color y Price junto con otra serie de propiedades que no son de su interés. Products es una colección de objetos Product. La declaración de tipo anónimo comienza por la palabra clave new. Inicializa un nuevo tipo que sólo utiliza dos propiedades de Product. Esto hace que la consulta devuelva una cantidad de datos menor.

Si no especifica nombres de miembro en el tipo anónimo, el compilador asignará a los miembros del tipo anónimo el mismo nombre que la propiedad que se utilice para inicializarlos. Debe proporcionar un nombre a una propiedad que se inicialice con una expresión.

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);
}

Cuando se asigna un tipo anónimo a una variable, esa variable debe inicializarse con la construcción var. Esto se debe a que el compilador es el único que tiene acceso al nombre subyacente del tipo anónimo. Para obtener más información acerca de var, vea Variables locales con asignación implícita de tipos (Guía de programación de C#).

Comentarios

Los tipos anónimos son tipos de referencia que se derivan directamente de object. El compilador les asigna un nombre, pese a que la aplicación no pueda obtener acceso al mismo. Desde la perspectiva de Common Language Runtime, un tipo anónimo no es diferente de los demás tipos de referencia, excepto en el hecho de que no se puede convertir a ningún otro tipo que no sea object.

Si dos o más tipos anónimos tienen el mismo número y tipo de propiedades en el mismo orden, el compilador los considerará como si fueran el mismo tipo y compartirán la misma información de tipo generada por el compilador.

Un tipo anónimo tiene ámbito de método. Para pasar un tipo anónimo (o una colección que contenga tipos anónimos) fuera del límite de un método, primero debe convertir el tipo en object. Sin embargo, esto anula el establecimiento inflexible de tipos del tipo anónimo. Si debe almacenar los resultados de la consulta o pasarlos fuera del límite de método, considere la posibilidad de utilizar una clase o una estructura con nombre común en lugar de un tipo anónimo.

Los tipos anónimos no pueden incluir tipos unsafe como propiedades.

Dado que los métodos Equals y GetHashCode de los tipos anónimos se definen según los elementos Equals y GetHashcode de las propiedades, dos instancias del mismo tipo anónimo sólo son iguales si todas sus propiedades son iguales.

Vea también

Conceptos

Guía de programación de C#

Expresiones de consultas con LINQ (Guía de programación de C#)

Referencia

Inicializadores de objeto y de colección (Guía de programación de C#)

Otros recursos

Introducción a LINQ en C#

Historial de cambios

Fecha

Historial

Motivo

Julio de 2008

Se ha agregado información sobre las restricciones de la conversión de tipos en el texto de presentación y la sección Comentarios.

Mejora de la información.