Partager via


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

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é, Cat.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'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 uniquement être initialisées à 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 initiale en objets dont la valeur et la forme peuvent différer de l'original.Ce la 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 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 Nullable

Il s'agit d'une erreur de compilation pour 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 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
};

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#)