Compartir a través de


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

Los tipos anónimos ofrecen un modo útil de encapsular un conjunto de propiedades de solo 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 cada propiedad.

Para crear tipos anónimos, use el operador new junto 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#).

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

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

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 LINQ (Guía de programación de C#).

Los tipos anónimos contienen una o más propiedades públicas de solo lectura. No es válido ningún otro tipo de miembros de clase, como métodos o eventos. La expresión que se usa para inicializar una propiedad no puede ser null, una función anónima o un tipo de puntero.

El escenario más común consiste en inicializar un tipo anónimo con algunas propiedades de otro tipo. En el ejemplo siguiente, supongamos que existe una clase que se denomina Product. La clase Product incluye las propiedades Color y Price, así como otras propiedades que no le interesan. La variable products es una colección de objetos Product. La declaración de tipo anónimo comienza por la palabra clave new. La declaración inicializa un tipo nuevo que solamente usa 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 está inicializando con una expresión, como se muestra en el ejemplo anterior. En el ejemplo siguiente, los nombres de las propiedades de tipo anónimo son Color y 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, se declara la variable como variable local tipificada implícitamente utilizando var. El nombre del tipo no se puede especificar en la declaración de variable porque solamente el compilador tiene acceso al nombre subyacente del tipo anónimo. Para obtener más información sobre var, vea Variables locales con asignación implícita de tipos (Guía de programación de C#).

Puede crear una matriz de elementos de tipo anónimo combinando una variable local y una matriz tipificadas implícitamente, tal y como se muestra en el ejemplo siguiente.

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

Comentarios

Los tipos anónimos son tipos de clase que se derivan directamente de un objeto. El compilador proporciona un nombre para cada tipo anónimo, aunque la aplicación no puede tener acceso a este. 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 del mismo ensamblado tienen el mismo número y tipo de propiedades en el mismo orden, el compilador los considerará como si fueran el mismo tipo. Comparten la misma información de tipos generada por el compilador.

No se puede declarar un campo, propiedad, evento o el tipo de devolución de un método como poseedor de un tipo anónimo. De igual forma, no puede declarar un parámetro formal de un método, propiedad, constructor o indizador como poseedor de un tipo anónimo. Para pasar un tipo anónimo, o una colección que contiene tipos anónimos, como argumento a un método, puede declarar el parámetro como objeto de tipo. Sin embargo, esto anula el propósito del establecimiento inflexible de tipos. 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 un struct con nombre común en lugar de un tipo anónimo.

Dado que los métodos Equals y GetHashCode de los tipos anónimos se definen según los métodos 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

Referencia

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

Conceptos

Guía de programación de C#

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

Otros recursos

Introducción a LINQ en C#

Historial de cambios

Fecha

Historial

Motivo

1 de abril de 2011

Se clarificó el texto.

Comentarios de los clientes.