créer des paramètres d'objet dans {}?

14

J'essaie de décoder un morceau de code d'un livre:

List<Person> people = new List<Person>()
{
new Person {FirstName="Homer",LastName="Simpson",Age=47},
new Person {FirstName="Marge",LastName="Simpson",Age=45}
};

Personne n'est qu'une simple classe qu'ils ont créée, avec un tas de champs: Nom, Nom, etc ...

Ce que je ne comprends pas, c'est que nous n'envoyons pas de paramètres à un constructeur de Person entre crochets non bouclés? J'ai essayé de répliquer ce code, mais il ne semble pas voler, des preneurs?

Merci pour votre contribution.

RealityDysfunction
la source
1
"J'ai essayé de répliquer ce code, mais il ne semble pas voler" <- vous devez utiliser C # 3 (VS 2008) ou une version ultérieure pour que cette syntaxe soit disponible.
AakashM
Soyez conscient des différences entre les deux concepts: initialisation d'objet et population d'objet. En général, vous faites l'initialisation dans le constructeur. La méthode de votre exemple est mieux utilisée pour la population et non pour l'initialisation.
NoChance

Réponses:

27

C # vous permet de spécifier des paramètres de propriété entre accolades lorsque l'objet est initialisé. Cela vous permet de choisir les éléments à initialiser et ceux à laisser par défaut.

Un constructeur, d'autre part, exécute un seul bloc de code avec un ensemble fixe de paramètres. Donc, pour obtenir le même effet, vous devez créer plusieurs constructeurs, tous avec les diverses combinaisons de propriétés que vous voudrez peut-être initialiser, ce qui pourrait être fastidieux.

var x = new Person {FirstName="Homer",LastName="Simpson",Age=47}; 

est exactement équivalent à ceci:

var x = new Person();
x.FirstName="Homer";
x.LastName="Simpson";
x.Age=47;

Sauf que c'est plus court et sans doute plus agréable pour les yeux.

Cela permet également des constructions comme vous l'avez démontré dans votre question, ce qui serait très fastidieux si vous deviez créer des variables temporaires et les initialiser comme je l'ai fait ici avant de les ajouter à la liste. (C'est ainsi que vous deviez le faire auparavant.) Le tout sans avoir besoin d'un constructeur explicitement défini qui prend la liste de paramètres souhaitée, qui peut ou non être disponible.

Notez également que même si un constructeur peut initialiser des propriétés avec un setter privé, cette technique (comme cela devrait être évident dans l'exemple fourni) ne fonctionnera que si vous avez un setter public pour la propriété. Notez également que mon exemple raccourci a implicitement appelé le constructeur par défaut (sans paramètre), qui devrait donc être présent.

tylerl
la source
Il pourrait être utile d'ajouter que pour cette raison, les propriétés initialisées dans les accolades doivent être réglables publiquement.
Yam Marcovic
@YamMarcovic ah. Oui. Note ajoutée à cet effet.
tylerl
2
Ah, je suis éclairé, excellente explication.
RealityDysfunction
2
Pour obtenir un effet très similaire avec un seul constructeur, vous pouvez rendre tous ses paramètres facultatifs. Ensuite, vous pourriez faire quelque chose comme new Person(lastName: "Simpson"), en omettant les paramètres firstNameet age.
svick
Cela ne résout pas pourquoi vous ne pouvez pas simplement les transmettre au constructeur, c'estvar x = new Person("Homer", "Simpson", 47);
rayray