2009-06-22 19 views
7

¿Cuáles son los mejores casos de uso para los tipos anónimos?¿Cuál es el propósito de los tipos anónimos?

Me parece que solo son útiles dentro de un contexto limitado, por ejemplo, una clase o una función. Difícilmente pueden usarse fuera de este contexto, porque sin reflexión nadie sabrá qué propiedades están disponibles en estos tipos.

Respuesta

4

Los tipos anónimos están destinados a ser utilizados únicamente en ámbitos muy estrechos. La mayoría de los casos de uso que he tenido para ellos involucran a Linq.

var result = from x in MyCollection 
      select new 
      { 
       x.Prop1, 
       x.Prop2 
      }; 

Además, en el caso de LINQ a SQL - con ayuda de los tipos anónimos generará diferentes SQL al seleccionar sólo las columnas que se utilizan en el tipo anónimo. En el caso anterior (si fuera una consulta de Linq a SQL), generaría algo como "seleccionar prop1, prop2 de mytable" en lugar de seleccionar todos los campos.

Nunca me encontré (todavía) con una situación en la que solo quería declarar un nuevo tipo anónimo en mi código. Supongo que, en todo caso, tal vez sería un buen uso para las constantes locales?

var x = new 
     { 
      FirstName = "Scott", 
      LastName = "Ivey" 
     }; 
+0

Hmmm ... Constantes locales es una idea interesante. Sí, he oído hablar de ellos utilizados con consultas de LINQ, pero nunca me pareció útil. –

0

Correcto; solo son prácticos dentro de un alcance extremadamente limitado.

+1

¿Conoce algún buen caso de uso? –

2

Sin embargo, no se detiene, p. el equipo de ASP.NET MVC que los utilizan como un objeto de parámetro de estilo Hashtable ...

Url.Action(new{controller="Home", action="Index"}) 

que no quiero alentar, sin embargo, debido a un uso intensivo de cuerdas mágicas.

Uso casi exclusivamente tipos anónimos en declaraciones LINQ donde en el mismo método itera sobre el conjunto de resultados. Eso es más o menos por qué se introdujeron

1

Son útiles en cualquier momento que desee ejecutar una consulta sobre algunos objetos y luego realizar alguna otra operación en ellos (como iterar).

Por ejemplo:

var procs = System.Diagnostics.Process.GetProcesses().Select(p => new { p.Id, p.ProcessName}); 
foreach(var p in procs) 
{ 
    Console.WriteLine("{0}: {1}", p.Id, p.ProcessName); 
} 
+0

A menudo encuentro en estas situaciones que ya tengo un objeto del que estoy seleccionando. ¿Por qué no debería simplemente seleccionar el objeto completo a menos que fuera un join()? –

+0

Iterar sobre la proyección (clase anterior) puede ser menos costoso que transportar propiedades que no te interesan. –

+0

tiene sentido. ¡Gracias! –

1

que he tenido mucha suerte con ellos últimamente en los campos satisfactorios en DataGrids o DataViews que dependen de las columnas de las consultas que ya no devuelven los mismos datos. Por ejemplo, a veces las fuentes de datos se normalizaron o los campos cambiaron de nombre por varias razones. Usando una consulta LINQ que devuelve tipos anónimos como un 'front-end', podemos mantener las cuadrículas existentes en producción.

+0

Las cuadrículas existentes se mantienen en producción porque los tipos anónimos tienen las mismas propiedades/interfaz que los datos anteriores? –

+0

Sí: las consultas solían volver a los conjuntos de datos con columnas específicas. Con el tiempo, esas columnas cambiaron o se implementaron objetos para proporcionar la misma funcionalidad pero sin los mismos nombres de propiedad. Seleccionar de colecciones de estos objetos que se proyectan en tipos de anon nos impide tener que ensuciar con las cuadrículas. – n8wrl

2

Un caso en el que he encontrado que el tipo anónimo es útil es serializar objetos en JSon y devolverlos en acciones ASP.NET MVC. No necesariamente desea devolver todas las propiedades de un objeto y un tipo anónimo puede ayudarlo con esto ..

[AcceptVerbs(HttpVerbs.Get)] 
    public ActionResult Person(int id) 
    { 
     Person person = manager.GetPersonById(id); 
     if(Request.IsAjaxRequest()) 
      return Json(new {Name=person.Name, Age=person.Age,...}); 
     else 
      ... 
    } 
Cuestiones relacionadas