Domanda

Quali sono i casi d'uso migliori per i tipi anonimi?

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

È stato utile?

Soluzione

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

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

Inoltre, nel caso di Linq to SQL, l'utilizzo di tipi anonimi genererà SQL diversi selezionando solo le colonne utilizzate nel tipo anonimo. Nel caso sopra (se fosse una query da Linq a SQL), genererebbe qualcosa come "select 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, sarebbe utile per le costanti locali?

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

Altri suggerimenti

Tuttavia, non si ferma ad es. il team ASP.NET MVC li usi come oggetto parametro in stile Hashtable ...

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

Il che non incoraggerei, però, a causa dell'uso intenso di stringhe magiche.

Uso quasi esclusivamente tipi anonimi nelle istruzioni LINQ in cui nello stesso metodo si scorre il set di risultati. Questo è praticamente il motivo per cui sono stati introdotti

Un caso che ho trovato utile il tipo anonimo è la serializzazione di oggetti su JSon e la loro restituzione in azioni MVC ASP.NET. Non devi necessariamente restituire tutte le proprietà di un oggetto e un tipo anonimo può aiutarti in 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
            ...
    }

Sono utili ogni volta che si desidera eseguire una query su alcuni oggetti e quindi eseguire altre operazioni 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);
}

Ultimamente ho avuto molta fortuna con loro in campi soddisfacenti in DataGrid o DataView che dipendono da colonne di query che non restituiscono 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 reti esistenti in produzione.

Una corretta; sono solo pratici in un ambito estremamente limitato.

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