Inizializzatori di oggetto e di insieme (Guida per programmatori C#)
Aggiornamento: novembre 2007
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 seguente viene illustrato come utilizzare un inizializzatore di oggetto con un tipo denominato. Si noti l'uso di proprietà implementate automaticamente nella classe Test. 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; }
}
static void MethodA()
{
// Object initializer
Cat cat = new Cat { Age = 10, Name = "Sylvester" };
}
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. Nella clausola select, un'espressione di query è in grado trasformare gli oggetti della sequenza originale in oggetti il cui valore e forma possono differire da quelli dell'originale. Questo è molto utile se si desidera archiviare solo una parte delle informazioni in 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 seguente 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
};
Vedere anche
Concetti
Espressioni query LINQ (Guida per programmatori C#)