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#).
private 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
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
};
Exemple
// 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.
}
Voir aussi
Référence
Types anonymes (Guide de programmation C#)
Concepts
Expressions de requête LINQ (Guide de programmation C#)
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Octobre 2010 |
A ajouté un exemple d'instruction de type anonyme qui ne fait pas partie d'une requête LINQ. A ajouté un lien vers une rubrique qui a plus d'informations sur les types anonymes. |
Commentaires client. |