Domanda

Ho visto molte descrizioni su come funzionano i tipi anonimi, ma non sono sicuro di come siano veramente utili.Quali sono alcuni scenari che i tipi anonimi possono essere utilizzati per affrontare in un programma ben progettato?

È stato utile?

Soluzione

I tipi anonimi non hanno nulla a che fare con la progettazione dei sistemi e nemmeno a livello di classe.Sono uno strumento che gli sviluppatori possono utilizzare durante la codifica.

Non tratto nemmeno i tipi anonimi come tipi di per sé.Li uso principalmente come tuple anonime a livello di metodo.Se eseguo una query sul database e quindi manipolo i risultati, preferirei creare un tipo anonimo e utilizzarlo piuttosto che dichiarare un tipo completamente nuovo che non verrà mai utilizzato o conosciuto al di fuori dell'ambito del mio metodo.

Ad esempio:

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

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

A nessuno importa di `a, il tipo anonimo.È lì, quindi non devi dichiarare un'altra classe.

Altri suggerimenti

Da LINQ in azione (pagina 76 sezione 2.6.3):

...i tipi anonimi [sono] un ottimo strumento per risultati temporanei rapidi e semplici.Non abbiamo bisogno di dichiarare che le classi mantengano risultati temporanei grazie ai tipi temporanei.

fondamentalmente sono utili per conservare temporaneamente le informazioni nell'ambito locale.Qualunque cosa in più richiede l'uso della riflessione e può diventare un bel problema.L'esempio fornito nel libro sopra citato è scritto per consolare l'id, il nome e la quantità di memoria occupata da ciascun processo in esecuzione.Creano un tipo anonimo, lo aggiungono a un elenco (tutta un'istruzione) e quindi utilizzano ObjectDumper per visualizzarlo.Pertanto il codice non necessita più di una classe dichiarata separatamente per contenere l'id, il nome e la memoria utilizzata ma è tutto dichiarato implicitamente portando il conteggio delle righe a 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);

L'uso più diffuso dei tipi anonimi consiste nella specifica delle proiezioni in una query LINQ to SQL.

Questa domanda

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

verrà convertito in questo SQL:

SELECT Column1, Column2 AS Alias2 FROM Table1

Con i tipi anonimi è possibile creare proiezioni ad hoc senza definirne prima il tipo.Il compilatore definirà il tipo per te.

Quando crei tipi per scopi "Usa e getta".Questo sembra essere avvenuto grazie a LINQ.Sembra essere un modo per creare strutture con campi al volo per una query LINQ.Restituzione di una struttura/tipo solo con campi specificati.Se non fosse per questo, dovresti dichiarare un tipo .Net per ogni combinazione univoca di campi che desideri recuperare.

Usali con Linq.

È importante sapere che LINQ non ti obbliga a utilizzare tipi anonimi.Puoi anche scrivere normali costruzioni di oggetti dopo la selezione.

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

Questo ti impedisce di programmare brutte riflessioni.

@Wouter:

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

dove ID e NOME sono proprietà reali della tua classe Persona.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top