Condividi tramite


Tipi anonimi (Guida per programmatori C#)

Aggiornamento: Luglio 2008

I tipi anonimi consentono di incapsulare facilmente un gruppo di proprietà di sola lettura in un solo oggetto senza dover prima definire un tipo in modo esplicito. Il nome del tipo viene generato dal compilatore e non è disponibile a livello di codice sorgente. Il tipo delle proprietà viene dedotto dal compilatore. Nell'esempio seguente viene illustrato un tipo anonimo inizializzato con due proprietà denominate Amount e Messagge.

var v = new { Amount = 108, Message = "Hello" };

I tipi anonimi vengono in genere utilizzati nella clausola select di un'espressione di query per restituire un sottoinsieme delle proprietà da ogni oggetto nella sequenza di origine. Per ulteriori informazioni sulle query, vedere Espressioni query LINQ (Guida per programmatori C#).

I tipi anonimi vengono creati utilizzando l'operatore new con un inizializzatore di oggetto. Per ulteriori informazioni sugli inizializzatori di oggetto, vedere Inizializzatori di oggetto e di insieme (Guida per programmatori C#).

I tipi anonimi sono tipi di classe costituiti da una o più proprietà pubbliche di sola lettura. Non sono consentiti altri tipi di membri della classe, quali metodi o eventi. Non è possibile eseguire il cast di un tipo anonimo a un’interfaccia o a un tipo diverso da object.

Lo scenario più comune è costituito dall'inizializzazione di un tipo anonimo con alcune proprietà da un altro tipo. Nell'esempio seguente, si supponga che una classe denominata Product includa le proprietà Color e Price insieme a diverse altre proprietà a cui non si è interessati. Products è un insieme di oggetti Product. La dichiarazione di tipo anonima, che inizia con la parola chiave new, inizializza un nuovo tipo che utilizza solo due proprietà da Product. In questo modo nella query viene restituita una quantità minore di dati.

Se non si specificano i nomi dei membri nel tipo anonimo, il compilatore assegna ai membri del tipo anonimo lo stesso nome della proprietà utilizzata per inizializzarli. È necessario specificare un nome per una proprietà di cui è in corso l'inizializzazione con un'espressione.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Quando un tipo anonimo è assegnato a una variabile, tale variabile deve essere inizializzata con il costrutto var, perché solo il compilatore ha accesso al nome sottostante del tipo anonimo. Per ulteriori informazioni su var, vedere Variabili locali tipizzate in modo implicito (Guida per programmatori C#).

Note

I tipi anonimi sono tipi di riferimento che derivano direttamente dall'oggetto. Il compilatore assegna loro un nome anche se l'applicazione non può accedervi. Dal punto di vista del common language runtime, un tipo anonimo non è diverso da qualsiasi altro tipo riferimento, eccetto per il fatto che non è possibile eseguirne il cast a un qualsiasi tipo diverso da object.

Se due o più tipi anonimi hanno lo stesso numero e tipo di proprietà nello stesso ordine, sono considerati dal compilatore come lo stesso tipo e condividono le stesse informazioni sul tipo generate dal compilatore.

Un tipo anonimo ha l'ambito del metodo. Per passare un tipo anonimo o un insieme che contiene tipi anonimi, al di fuori di un limite di metodo, è prima necessario eseguire il cast del tipo sull'oggetto. In questo modo viene tuttavia vanificata la tipizzazione forte del tipo anonimo. Se è necessario archiviare i risultati della query o passarli al di fuori del limite del metodo, prendere in considerazione l'uso di una normale struttura o una classe denominata anziché di un tipo anonimo.

I tipi anonimi non possono contenere tipi non sicuri come proprietà.

Perché i metodi Equals e GetHashCode nei tipi anonimi sono definiti in termini di proprietà Equals e GetHashcode, due istanze dello stesso tipo anonimo sono uguali solo se tutte le proprietà sono uguali.

Vedere anche

Concetti

Guida per programmatori C#

Espressioni query LINQ (Guida per programmatori C#)

Riferimenti

Inizializzatori di oggetto e di insieme (Guida per programmatori C#)

Altre risorse

Nozioni di base su LINQ in C#

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2008

Informazioni aggiunte riguardo alle restrizioni del cast nel testo introduttivo della sezione osservazioni.

Miglioramento delle informazioni.