Tipi anonimi (Guida per programmatori C#)

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 di ciascuna proprietà viene dedotto dal compilatore.

è possibile creare tipi anonimi utilizzando l'operatore new insieme a un inizializzatore di oggetto. Per ulteriori informazioni sugli inizializzatori di oggetto, vedere Inizializzatori di oggetto e di insieme (Guida per programmatori C#).

Nell'esempio riportato di seguito viene illustrato un tipo anonimo inizializzato con due proprietà denominate Amount e Message.

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

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

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 di query LINQ (Guida per programmatori C#).

I tipi anonimi contengono una o più proprietà di sola lettura. Non sono consentiti altri tipi di membri della classe, quali metodi o eventi. L'espressione utilizzata per inizializzare una proprietà non può essere null, una funzione anonima o un tipo puntatore.

Lo scenario più comune è costituito dall'inizializzazione di un tipo anonimo con le proprietà di un altro tipo. Nell'esempio seguente, presupporre che esiste una classe denominata Product. La classe Product include le proprietà Color e Price, insieme ad altre proprietà a cui non si è interessati. La variabile products è un insieme di oggetti Product. La dichiarazione di tipo anonima, che inizia con la parola chiave new, La dichiarazione 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, come mostrato nell'esempio precedente. Nell'esempio riportato di seguito, i nomi delle proprietà di tipo anonimo sono Color e Price.

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);
}

In genere quando si utilizza un tipo anonimo per inizializzare una variabile, si dichiara quest'ultima come variabile locale tipizzata tramite var. Il nome del tipo non può essere specificato nella dichiarazione di variabile 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#).

È possibile creare una matrice di elementi tipizzati in modo anonimo combinando una variabile locale tipizzata in modo implicito e una matrice tipizzata in modo implicito, come illustrato nell'esempio seguente.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

Note

I tipi anonimi sono tipi di classe che derivano direttamente dall'oggetto. Il compilatore fornisce un nome per ogni tipo anonimo, anche se l'applicazione non è in grado di 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 dello stesso assembly hanno lo stesso numero e tipo di proprietà nello stesso ordine, sono considerati dal compilatore come lo stesso tipo. Condividono le stesse informazioni sul tipo generate dal compilatore.

Non è possibile dichiarare che un campo, una proprietà, un evento o il tipo restituito di un metodo siano di tipo anonimo. Analogamente, non è possibile dichiarare un parametro formale di un metodo, una proprietà, un costruttore o un indicizzatore come avente un tipo anonimo. Per passare un tipo anonimo o un insieme che contiene tipi anonimi come argomento a un metodo, è possibile dichiarare il parametro come oggetto tipo. In questo modo viene tuttavia vanificato lo scopo della tipizzazione forte. 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.

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

Vedere anche

Riferimenti

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

Concetti

Guida per programmatori C#

Espressioni di query LINQ (Guida per programmatori C#)

Altre risorse

Nozioni di base su LINQ in C#

Cronologia delle modifiche

Data

Cronologia

Motivo

Aprile 2011

Chiarimento relativo al testo.

Commenti e suggerimenti dei clienti.