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

Gli inizializzatori di oggetto consentono di assegnare valori a qualsiasi proprietà o campo accessibile di un oggetto in fase di creazione senza dover richiamare un costruttore in modo esplicito. Nell'esempio riportato di seguito viene illustrato come utilizzare un inizializzatore di oggetto con un tipo denominato, Cat. Si noti l'uso di proprietà implementate automaticamente nella classe Cat. Per ulteriori informazioni, vedere Proprietà implementate automaticamente (Guida per programmatori C#).

private class Cat
{
    // Auto-implemented properties.
    public int Age { get; set; }
    public string Name { get; set; }
}
Cat cat = new Cat { Age = 10, Name = "Fluffy" };

Inizializzatori di oggetto con tipi anonimi

Anche se gli inizializzatori di oggetto possono essere utilizzati in qualsiasi contesto, sono particolarmente utili nelle espressioni di query LINQ. Le espressioni di query si avvalgono di frequente di tipi anonimi, che possono essere inizializzati solo con un inizializzatore di oggetto, come illustrato nella seguente dichiarazione.

var pet = new { Age = 10, Name = "Fluffy" };

I tipi anonimi consentono alla clausola select in un'espressione di query LINQ di trasformare gli oggetti della sequenza originale in oggetti i cui valori e la cui forma potrebbero essere diversi dall'originale. Questo è utile se si desidera archiviare solo una parte delle informazioni di ogni oggetto di una sequenza. Nell'esempio seguente, si supponga che un oggetto prodotto (p) contenga diversi campi e metodi e che si sia interessati a creare solo una sequenza di oggetti che contengono il nome e il prezzo unitario del prodotto.

var productInfos =
    from p in products
    select new { p.ProductName, p.UnitPrice };

Quando questa query verrà eseguita, la variabile productInfos conterrà una sequenza di oggetti a cui sarà possibile accedere in un'istruzione foreach come illustrato in questo esempio:

foreach(var p in productInfos){...}

Ogni oggetto nel nuovo tipo anonimo dispone di due proprietà pubbliche che ricevono gli stessi nomi delle proprietà o dei campi nell'oggetto originale. È inoltre possibile rinominare un campo mentre si crea un tipo anonimo. Nell'esempio seguente il campo UnitPrice viene rinominato Price.

select new {p.ProductName, Price = p.UnitPrice};

Inizializzatori di oggetto con tipi nullable

L'uso di un inizializzatore di insieme con una struttura nullable, genera un errore in fase di compilazione.

Inizializzatori di insieme

Gli inizializzatori di insieme consentono di specificare uno o più inizializzatori di elemento quando si inizializza una classe di insiemi che implementa IEnumerable. Gli inizializzatori di elemento possono essere un semplice valore, un'espressione o un inizializzatore di oggetto. Se si utilizza un inizializzatore di insieme, non è necessario specificare più chiamate al metodo Add della classe nel codice sorgente, in quanto le chiamate vengono aggiunte dal compilatore.

Negli esempi seguenti vengono illustrati due semplici inizializzatori di insieme:

List<int> digits = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
List<int> digits2 = new List<int> { 0 + 1, 12 % 3, MakeInt() };

Nell'inizializzatore di insieme riportato di seguito vengono utilizzati inizializzatori di oggetto per inizializzare oggetti della classe Cat definiti in un esempio precedente. Si noti che i singoli inizializzatori di oggetto sono racchiusi tra parentesi e separati da virgole.

List<Cat> cats = new List<Cat>
{
    new Cat(){ Name = "Sylvester", Age=8 },
    new Cat(){ Name = "Whiskers", Age=2 },
    new Cat(){ Name = "Sasha", Age=14 }
};

È possibile specificare null come elemento in un inizializzatore di insieme se il metodo Add dell'insieme lo consente.

List<Cat> moreCats = new List<Cat>
{
    new Cat(){ Name = "Furrytail", Age=5 },
    new Cat(){ Name = "Peaches", Age=4 },
    null
};

Esempio

// The following code consolidates examples from the topic.
class ObjInitializers
{
    private class Cat
    {
        // Auto-implemented properties.
        public int Age { get; set; }
        public string Name { get; set; }
    }

    static void Main()
    {
        Cat cat = new Cat { Age = 10, Name = "Fluffy" };

        List<Cat> cats = new List<Cat>
        {
            new Cat(){ Name = "Sylvester", Age=8 },
            new Cat(){ Name = "Whiskers", Age=2 },
            new Cat(){ Name = "Sasha", Age=14 }
        };

        List<Cat> moreCats = new List<Cat>
        {
            new Cat(){ Name = "Furrytail", Age=5 },
            new Cat(){ Name = "Peaches", Age=4 },
            null
        };

        // Display results.
        System.Console.WriteLine(cat.Name);

        foreach (Cat c in cats)
            System.Console.WriteLine(c.Name);

        foreach (Cat c in moreCats)
            if (c != null)
                System.Console.WriteLine(c.Name);
            else
                System.Console.WriteLine("List element has null value.");
    }
    // Output:
    //Fluffy
    //Sylvester
    //Whiskers
    //Sasha
    //Furrytail
    //Peaches
    //List element has null value.
}

Vedere anche

Riferimenti

Tipi anonimi (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Espressioni di query LINQ (Guida per programmatori C#)

Cronologia delle modifiche

Data

Cronologia

Motivo

Ottobre 2010

È stato aggiunto un esempio di una dichiarazione di tipo anonimo che non fa parte di una query LINQ. È stato aggiunto un collegamento a un argomento che contiene ulteriori informazioni sui tipi anonimi.

Commenti e suggerimenti dei clienti.