Initialiseurs d'objets et de collection (Guide de programmation C#)

Mise à jour : novembre 2007

Les initialiseurs d'objets vous permettent d'assigner des valeurs à tous les champs ou propriétés accessibles d'un objet au moment de la création sans avoir à appeler explicitement de constructeur. L'exemple suivant indique comment utiliser un initialiseur d'objet avec un type nommé. Notez l'utilisation de propriétés implémentées automatiquement dans la classe Test. Pour plus d'informations, consultez Propriétés implémentées automatiquement (Guide de programmation 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" };
}

Initialiseurs d'objets avec les types anonymes

Même si les initialiseurs d'objets peuvent être utilisés dans tout contexte, ils sont particulièrement utiles dans les expressions de requête LINQ. Les expressions de requête utilisent fréquemment des types anonymes, qui peuvent être initialisés uniquement avec un initialiseur d'objet. Dans la clause select, une expression de requête peut transformer des objets de la séquence d'origine en objets dont la valeur et la forme peuvent différer de l'original. Ce la s'avère très utile si vous souhaitez stocker uniquement une partie des informations dans chaque objet d'une séquence. Dans l'exemple suivant, supposons qu'un objet de produit (p) contient de nombreux champs et méthodes et que vous souhaitez uniquement créer une séquence d'objets qui contiennent le nom de produit et le prix unitaire.

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

Lorsque cette requête est exécutée, la variable productInfos contiendra une séquence d'objets qui peuvent être accédés dans une instruction foreach comme indiqué dans cet exemple :

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

Chaque objet dans le nouveau type anonyme a deux propriétés publiques qui reçoivent les mêmes noms que les propriétés ou champs dans l'objet d'origine. Vous pouvez également renommer un champ lorsque vous créez un type anonyme. L'exemple suivant renomme le champ UnitPrice en Price.

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

Initialiseurs d'objets avec les types nullables

C'est une erreur de compilation qui intervient au moment de l'utilisation d'un initialiseur de collection avec un struct nullable.

Initialiseurs de collection

Les initialiseurs de collection vous permettent de spécifier un ou plusieurs initialiseurs d'élément lorsque vous initialisez une classe de collection qui implémente IEnumerable. Les initialiseurs d'élément peuvent être une valeur simple, une expression ou un initialiseur d'objet. En utilisant un initialiseur de collection, il n'est pas nécessaire de spécifier plusieurs appels à la méthode Add de la classe dans votre code source ; le compilateur ajoute les appels.

Les exemples suivants présentent deux initialiseurs de collection simples :

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

L'initialiseur de collection suivant utilise des initialiseurs d'objets pour initialiser les objets de la classe Cat définis dans un exemple précédent. Notez que les initialiseurs d'objets individuels sont placés entre accolades et séparés par des virgules.

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

Vous pouvez spécifier null comme un élément dans un initialiseur de collection si la méthode Add de la collection l'autorise.

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

Voir aussi

Concepts

Guide de programmation C#

Expressions de requête LINQ (Guide de programmation C#)

Référence

Types anonymes (Guide de programmation C#)