Les initialisateurs d'objets ont été ajoutés au C# 3, afin de simplifier la construction d'objets lorsque vous utilisez un objet.
Les constructeurs s'exécutent, avec 0 ou plusieurs paramètres, et sont utilisés pour créer et initialiser un objet. avant la méthode appelante obtient l'identifiant de l'objet créé. Par exemple :
MyObject myObjectInstance = new MyObject(param1, param2);
Dans ce cas, le constructeur de MyObject
sera exécuté avec les valeurs param1
y param2
. Ces deux éléments sont utilisés pour créer le nouveau MyObject
en mémoire. L'objet créé (qui est configuré à l'aide de ces paramètres) est retourné, et mis à la valeur myObjectInstance
.
En général, il est considéré comme une bonne pratique qu'un constructeur exige les paramètres nécessaires à la configuration complète d'un objet, afin qu'il soit impossible de créer un objet dans un état invalide.
Cependant, il existe souvent des propriétés "supplémentaires" qui peuvent être définies, mais qui ne sont pas obligatoires. Cela pourrait être géré par des constructeurs surchargés, mais cela conduit à avoir beaucoup de constructeurs qui ne sont pas nécessairement utiles dans la majorité des circonstances.
Cela conduit aux initialisateurs d'objets - Un initialisateur d'objet vous permet de définir des propriétés ou des champs sur votre objet. après il a été construit, mais avant vous pouvez l'utiliser pour n'importe quoi d'autre. Par exemple :
MyObject myObjectInstance = new MyObject(param1, param2)
{
MyProperty = someUsefulValue
};
Le comportement sera à peu près le même que si vous faites ceci :
MyObject myObjectInstance = new MyObject(param1, param2);
myObjectInstance.MyProperty = someUsefulValue;
Cependant, en multithreading l'atomicité de l'initialisateur de l'objet peut être bénéfique, puisqu'elle empêche l'objet de se trouver dans un état non complètement initialisé (cf. cette réponse pour plus de détails) - il est soit nul, soit initialisé comme vous l'aviez prévu.
De plus, les initialisateurs d'objets sont plus simples à lire (en particulier lorsque vous définissez plusieurs valeurs), ils vous offrent donc le même avantage que de nombreuses surcharges sur le constructeur, sans qu'il soit nécessaire d'avoir de nombreuses surcharges compliquant l'API de cette classe.