Partager via


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

Les initialiseurs d'objet vous permettent d'assigner des valeurs aux champs ou propriétés accessibles d'un objet au moment de la création sans avoir à appeler un constructeur suivi de lignes d'instructions d'assignation. La syntaxe de l'initialiseur de l'objet vous permet de spécifier les arguments d'un constructeur ou de les omettre (et la syntaxe de parenthèses). L'exemple suivant montre comment utiliser l'initialiseur de l'objet de type nommé, Cat, et comment appeler le constructeur par défaut. Notez l'utilisation de propriétés implémentées automatiquement dans la classe Cat. Pour plus d'informations, consultez Propriétés implémentées automatiquement (Guide de programmation C#).

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

Initialiseurs d'objet avec des types anonymes

Même si les initialiseurs d'objets peuvent être utilisés dans n'importe quel contexte, ils sont particulièrement utiles dans les expressions de requête LINQ. Les expressions de requête utilisent fréquemment des types anonymes, et ne peuvent être initialisées qu'à l'aide d'un initialiseur d'objet, comme indiqué dans la déclaration suivante.

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

Les types anonymes permettent à la clause select d'une expression de requête LINQ de transformer les objets de la séquence d'origine en objets dont la valeur et la forme peuvent différer de l'original. Cela s'avère utile si vous souhaitez stocker uniquement une partie des informations de 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 contient une séquence d'objets qui sont accessibles 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 de 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 Nullable

C'est une erreur au moment de la compilation que d'utiliser un initialiseur d'objet 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 une virgule.

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

Exemple

// The following code consolidates examples from the topic. 
class ObjInitializers
{
    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.
}

Voir aussi

Référence

Types anonymes (Guide de programmation C#)

Concepts

Guide de programmation C#

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