
Envoyé par
ralf91
- Le deuxième constructeur sert à quoi exactement puisque l'initialisation se fait dans le premier ?
Ca permet d'initialiser l'objet de 2 façons différentes, en spécifiant le paramètre ou non. Si tu utilises la forme sans paramètre, c'est comme si tu avais passé une chaine vide en paramètre :
Person p = new Person(); // équivalent à new Person("");

Envoyé par
ralf91
Pourquoi c'est déconseillé ?
Parce que ça veut dire que n'importe qui peut modifier l'état interne de ta classe, sans que tu puisses le savoir ou l'empêcher. Ca brise l'encapsulation. Dans certains cas, ce n'est pas gênant, c'est pour ça que très souvent les propriétés ne font rien d'autre que d'accéder au champ. Mais si un jour tu veux ajouter de la logique dans le set (contrôler la valeur, déclencher un évènement, etc), il faudra forcément que ce soit une propriété. Et si c'est une DLL utilisée par d'autre programme, tu ne peux pas juste transformer le champ en propriété car les autres programmes ne sauraient plus l'utiliser (à moins d'être recompilés). Donc en général on n'expose jamais de champs publics, on utilise toujours des propriétés. Ca permet de modifier facilement l'implémentation interne plus tard, sans changer l'interface publique.

Envoyé par
ralf91
Si j'ai bien compris, les propriétés se sont des attributs mais plus sécurisés ! (on peut y ajouter des contrôles au niveau des setters).
Tu peux aussi personnaliser le code du getter, ça se fait souvent, par exemple, pour faire des initialisations tardives (lazy initialization) :
1 2 3 4 5 6 7 8 9 10 11 12 13
| private List<string> _items;
public IList<string> Items
{
get
{
if (_items == null)
{
_items = LoadItemsFromDatabase();
}
return _items;
}
} |
Au passage, tu remarqueras que la propriété ne renvoie pas une List<T> mais une IList<T> : de cette façon, si je veux un jour remplacer ma List<T> utilisée en interne par une autre implémentation de l'interface IList<T>, le code qui utilise cette propriété ne sera pas impacté

Envoyé par
ralf91
Les constructeurs permettent de donner une valeur initiale aux attributs c'est tout.
pas seulement, tu peux faire toutes sortes d'opérations nécessaires à l'initialisation de ta classe
Partager