2008-09-07 17 views
15

He visto muchas descripciones de cómo funcionan los tipos anónimos, pero no estoy seguro de cómo son realmente útiles. ¿Cuáles son algunos escenarios que los tipos anónimos pueden usarse para abordar en un programa bien diseñado?¿Cómo deben usarse los tipos anónimos en C#?

Respuesta

18

Los tipos anónimos no tienen nada que ver con el diseño de sistemas o incluso en el nivel de clase. Son una herramienta para que los desarrolladores utilicen al codificar.

Ni siquiera trato tipos anónimos como tipos per-se. Los uso principalmente como tuplas anónimas a nivel de método. Si consulto la base de datos y luego manipulo los resultados, prefiero crear un tipo anónimo y usar eso en lugar de declarar un tipo completamente nuevo que nunca se usará o conocerá fuera del alcance de mi método.

Por ejemplo:

var query = from item in database.Items 
      // ... 
      select new { Id = item.Id, Name = item.Name }; 

return query.ToDictionary(item => item.Id, item => item.Name); 

Nadie se preocupa por `a, el tipo anónimo. Está ahí para que no tenga que declarar otra clase.

+0

¿Alguna vez necesita esto. Seguramente si haces tanto en tu método que garantiza un tipo anónimo, entonces debes refactorizar el método. En su ejemplo, consulta la base de datos y luego modifica los resultados, eso es 2 métodos separados para mí. – Stimul8d

+4

No estoy modificando los resultados, los estoy transmutando de alguna otra forma que sea más fácil de devolver. Uno debe tener cuidado de no sobre-distribuir su código sobre múltiples métodos porque eso haría el código completamente ilegible y crear, ya que no hay posibilidad de usar tipos anónimos, muchos códigos desagradables o tipos codificados manualmente. –

1

Cuando crea tipos para propósitos de "Uso y lanzamiento". Esto parece haber venido debido a LINQ. Parece ser una forma de crear estructuras con campos sobre la marcha para una consulta LINQ. Devolver una estructura/tipo con campos especificados solamente. Si no fuera por esto, tendría que declarar un tipo .Net para cada combinación única de campos que desea recuperar.

8

De LINQ en la acción (página 76 la sección 2.6.3):

... [tipos anónimos son] una gran herramienta para los resultados temporales rápidas y sencillas. No necesitamos declarar clases para mantener resultados temporales gracias a los tipos temporales.

básicamente son útiles para mantener temporalmente la información en el ámbito local. Cualquier cosa más requiere el uso de la reflexión y puede convertirse en un gran problema. El ejemplo que dan en el libro citado anteriormente está escrito para consolar la identificación, el nombre y la cantidad de memoria tomada por cada proceso en ejecución. Crean un tipo anónimo, lo agregan a una lista (todas las declaraciones) y luego usan ObjectDumper para generarlo. Por tanto, el código ya no necesita una clase declarada por separado para mantener la identificación, el nombre y la memoria utilizada, pero es todo declarados implícitamente con lo que la línea cuenta atrás hasta 4:

var pl = new List<Object>(); 
foreach(var p in Process.GetProcesses()) 
    pl.Add(new {p.Id, p.ProcessName, Memory=p.WorkingSet64}); 
ObjectDumper.Write(pl); 
2

Úselos con Linq.

2

El uso más popular de los tipos anónimos es para especificar proyecciones en una consulta LINQ a SQL.

Esta consulta

from x in db.Table1 select new {x.Column1, Alias2=x.Column2} 

se convertirá en este SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1 

Con los tipos anónimos, puede crear proyecciones especiales sin definir el tipo para ello de antemano. El compilador definirá el tipo para usted.

0

Es importante saber que LINQ no lo obliga a utilizar tipos anónimos. También puede escribir construcciones de objetos normales después de seleccionar.

var query = from item in database.Items 
// ... 
select new Person(item.id, item.Name) 

Esto evita la programación de feos reflejos.

-1

@Wouter:

var query = from item in database.Items 
select new Person 
{ 
ID =item.id, 
NAME= item.Name 
}; 

donde ID y NAME son propiedad real de la clase de persona.

+0

Eso no es un tipo anónimo – Joe

Cuestiones relacionadas