Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Los tipos anónimos proporcionan una manera cómoda de encapsular un conjunto de propiedades de solo lectura en un solo objeto sin definir primero un tipo con nombre. El compilador genera un nombre de tipo en tiempo de compilación al que no se puede acceder en el código fuente. El compilador deduce el tipo de cada propiedad.
Cree tipos anónimos mediante el new operador junto con un inicializador de objeto. En el ejemplo siguiente se muestra un tipo anónimo que se inicializa con dos propiedades y NameAge:
var person = new { Name = "Alice", Age = 30 };
Console.WriteLine($"{person.Name} is {person.Age} years old.");
// Output:
// Alice is 30 years old.
Nombres de propiedad inferidos
Puede especificar los nombres de propiedad explícitamente mediante la Name = value sintaxis . Al inicializar un tipo anónimo con una expresión de acceso de miembro o variable, el compilador deduce el nombre de propiedad de esa expresión:
string productName = "Laptop";
decimal price = 999.99m;
var product = new { productName, price };
Console.WriteLine($"{product.productName}: {product.price:C}");
// Output:
// Laptop: $999.99
En el ejemplo anterior, el compilador deduce productName y price como los nombres de propiedad de los nombres de variable usados en el inicializador.
Declarar tipos anónimos con var
Dado que el compilador genera el nombre de tipo y no puede acceder a él en el código fuente, debe usar var para declarar la variable local. No se puede especificar explícitamente el nombre de tipo:
// You must use var — you can't write a named type here.
var person = new { Name = "Alice", Age = 30 };
Uso de tipos anónimos en consultas LINQ
Los tipos anónimos aparecen con más frecuencia en la select cláusula de una expresión de consulta, donde proyectan un subconjunto de propiedades de cada elemento de origen:
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.
Igualdad
Dos instancias de tipo anónimo que tienen los mismos nombres de propiedad y tipos en el mismo orden comparten el mismo tipo generado por el compilador. El compilador invalida Equals y GetHashCode para que la igualdad compare los valores de propiedad en lugar de la identidad de referencia:
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 anidados
Los tipos anónimos pueden contener otros tipos anónimos como valores de propiedad:
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
Características
Los tipos anónimos tienen las siguientes características:
- El compilador los genera como
internal sealed classtipos que derivan de Object. - Todas las propiedades son
publicy de solo lectura. - Los tipos anónimos admiten
withexpresiones para la mutación no destructiva. - El compilador genera sobrescrituras basadas en Equals, GetHashCode y ToString valores.
- Los tipos anónimos admiten árboles de expresión, mientras que las tuplas no.
Limitaciones
Los tipos anónimos tienen varias limitaciones:
- No se pueden usar como tipos de valor devuelto de método, parámetros de método o tipos de campo porque no se puede asignar un nombre al tipo.
- Se limitan al ámbito del método donde se declaran.
- No se pueden agregar métodos, eventos ni operadores personalizados.
- Las propiedades siempre son de solo lectura; Los tipos anónimos no admiten propiedades mutables.
Cuándo usar tuplas en su lugar
Para la mayoría del código nuevo, considere la posibilidad de usar tuplas en lugar de tipos anónimos. Como tipos de valor, las tuplas proporcionan un mejor rendimiento. También proporcionan compatibilidad con deconstrucción y sintaxis más flexible. Los tipos anónimos siguen siendo la mejor opción cuando se necesita compatibilidad con árboles de expresiones o semántica de tipo de referencia. Para obtener una comparación detallada, consulte Elección entre tipos anónimos y de tupla.