2009-06-22 19 views
7

Quali sono i migliori casi d'uso per i tipi anonimi?Qual è lo scopo dei tipi anonimi?

Mi sembra che siano utili solo in un contesto limitato, ad esempio una classe o una funzione. Non possono essere usati al di fuori di questo contesto, perché senza riflessione nessuno saprà quali proprietà sono disponibili su questi tipi.

risposta

4

I tipi anonimi sono pensati per essere utilizzati solo in ambiti molto ristretti. La maggior parte dei casi d'uso che ho avuto per loro coinvolgono Linq.

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

Inoltre, nel caso di LINQ to SQL - usando tipi anonimi genererà SQL diversa selezionando solo le colonne utilizzate nel tipo anonimo. Nel caso precedente (se si trattasse di una query da Linq a SQL), genererebbe qualcosa come "seleziona prop1, prop2 da mytable" invece di selezionare tutti i campi.

Non ho mai incontrato (ancora) una situazione in cui volevo solo dichiarare un nuovo tipo anonimo nel mio codice. Suppongo che se non altro, forse sarebbe un buon uso per le costanti locali?

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

Hmmm ... Le costanti locali sono un'idea interessante. Sì, ne ho sentito parlare con le query LINQ, ma non mi è mai sembrato utile. –

0

Corretto; sono solo pratici in un ambito estremamente limitato.

+1

Sei a conoscenza di casi di utilizzo corretto? –

2

Tuttavia, non si ferma ad es. MVC ASP.NET squadra li si usa come oggetto parametro Hashtable in stile ...

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

che non mi incoraggiano, anche se, a causa di un uso pesante di stringhe di magia.

Uso quasi esclusivamente i tipi anonimi in istruzioni LINQ dove nello stesso metodo si esegue iterazione sul gruppo di risultati. Questo è praticamente il motivo per cui sono stati introdotti

1

Sono utili in qualsiasi momento si desidera eseguire una query su alcuni oggetti e poi fare qualche altra operazione su di essi (come iterare).

Ad esempio:

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

Trovo spesso in queste situazioni che ho già un oggetto da cui sto selezionando. Perché non dovrei semplicemente selezionare l'intero oggetto a meno che non fosse un join()? –

+0

L'iterazione sulla proiezione (anon class) può essere meno costosa del portare in giro proprietà che non ti interessano. –

+0

Ha senso. Grazie! –

1

ho avuto un sacco di fortuna con loro ultimamente nei campi soddisfacenti in DataGrid o DataViews che dipendono colonne dalle query che restituiscono non sono più gli stessi dati. Ad esempio, a volte le origini dati sono state normalizzate o i campi sono stati rinominati per vari motivi. Utilizzando una query LINQ che restituisce tipi anonimi come "front-end", siamo in grado di mantenere le griglie esistenti nella produzione.

+0

Le griglie esistenti vengono mantenute in produzione perché i tipi anonimi hanno le stesse proprietà/interfaccia dei dati vecchi? –

+0

Sì: le query utilizzate tornano in serie di dati con colonne specifiche. Col passare del tempo quelle colonne sono cambiate o gli oggetti sono stati implementati per fornire la stessa funzionalità ma senza gli stessi nomi di proprietà. La selezione da collezioni di questi oggetti che proiettano su tipi anon ci impedisce di dover eliminare le griglie. – n8wrl

2

Un caso in cui ho trovato utile il tipo anonimo è la serializzazione di oggetti in JSon e la loro restituzione in azioni ASP.NET MVC. Non vuoi necessariamente restituire tutte le proprietà di un oggetto e un tipo anonimo può aiutarti con questo ..

[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 
      ... 
    }