Bonjour,
Déjà, pour être compréhensible, afin que tout le monde sache de quoi je parle (d'un article à l'autre, j'ai trouvé différents noms aux principes dont je parle, donc je préfère que tout le monde soit d'accord).
Attribut : "variable" de l'objet :
Propriété : couple de "méthodes" dédiées à l'accès d'un attribut (généralement privé) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class test { public int MonAttribut; }
Les propriétés sont la suite logique des méthodes "SetAttribut()" et GetAttribut()" qu'on trouvait dans le code C++ autrefois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class test { private int _monAttributPrivé; public int MaPropriété { get { return _monAttributPrivé; } set { _monAttributPrivé = value; } } }
Maintenant que les définitions sont données, les questions :
1) J'ai bon niveau désignation des deux concepts ?
2) J'ai bien compris la différence entre les deux, même si elle est parfois subtile :
- Dans l'exemple ci-dessus, je ne vois absolument aucune différence entre les deux concepts
- L'utilisation de "readonly" sur un attribut permet de reproduire le comportement une propriété avec uniquement un get.
- Ne reste donc que le cas des propriété avec uniquement un set, ainsi que celles avec des actions au niveau du set et/ou get
=> Pourtant, je vois de plus en plus de personnes écrire des propriétés avec cette syntaxe :
Et là, je reste pantois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 class test { int MaPropriété { get; set; } }
Quel est l'intérêt d'utiliser une propriété plutôt qu'un attribut ? Puisqu'on n'a pas de corps aux get/set, et qu'en plus il n'y a pas d'attribut privé caché derrière (et donc un bordel pas possible le jour où on décide de mettre un corps aux get/set).
En effet, par exemple, les propriétés me servent habitellement à faire ce genre de choses :
C'est à dire avec une valeur ajoutée dans le get/set.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 class Sequence { int _currentValue = 1; public int NextValue { get { if (_currentValue == int.MaxValue) throw new Exception("Dépacement de capacité dans la séquence..."); return _currentValue++; } } public int CurrentValue { get { return _currentValue; } set { if (value <= 0) throw new Exception("Une séquence ne fonctionne que sur l'interval [1,∞["); _currentValue = value; } } }
A quoi sert donc cette nouvelle syntaxe {get;set;}
=> Si par hasard un jour on a envie de faire une Propriété au lieu d'un attribut ?
Vu le changement de code nécessaire pour utiliser un attribut privé partout où les valeurs ajoutées au get/set ne devront pas être exploitées, je ne vois pas trop ce que ça change... D'autant qu'au niveau de l'appel dans le code, propriété ou attribut, c'est rigoureusement identique.
Quel wagon ais-je raté ?
Partager