La raison principale n'est pas liée à l'encapsulation OOP (bien que les gens disent souvent que c'est le cas), et tout à voir avec le versioning. En effet, à partir de la position OOP, on pourrait dire que les champs sont meilleurs que les propriétés «aveugles», car un manque d'encapsulation est plus clair que quelque chose qui fait semblant d'être encapsulé et ensuite le souffle. Si l'encapsulation est importante, alors il devrait être bon de voir quand elle n'est pas là.
Une propriété appelée Foo ne sera pas traitée de la même manière de l'extérieur qu'un champ public appelé Foo. Dans certaines langues, cela est explicite (le langage ne supporte pas directement les propriétés, donc vous avez un getFoo et un setFoo) et dans certains cas il est implicite (C# et VB.NET supportent directement les propriétés, mais ils ne sont pas compatibles binaires avec les champs et le code compilés pour utiliser un champ va se casser s'il est changé en propriété, et vice-versa).
Si votre Foo fait juste un ensemble "aveugle" et écris un champ sous-jacent, alors il n'y a actuellement aucun avantage d'encapsulation à pour exposer le champ. Cependant, s'il y a une exigence ultérieure de tirer parti de l'encapsulation pour éviter les valeurs invalides (vous devriez toujours empêcher les valeurs invalides, mais peut-être vous ne l'avez pas réalisé lorsque vous avez écrit la classe, ou peut-être "a changé avec un changement d'étendue), pour encapsuler l'évaluation memoised, pour déclencher d'autres changements dans l'objet, pour déclencher un événement on-change, pour éviter des ensembles inutiles coûteux et ainsi de suite, alors vous ne pouvez pas faire ce changement sans casser le code courant.
Si la classe est interne au composant en question, ce n'est pas un problème, et je dirais utiliser des champs si les champs lisent raisonnablement selon le principe général de YAGNI. Cependant, YAGNI ne joue pas si bien à travers les frontières des composants (si j'avais besoin de mon composant pour fonctionner aujourd'hui, je vais probablement avoir besoin que ça fonctionne demain après que vous ayez changé le composant dont dépend le mien), il peut donc être judicieux d'utiliser les propriétés de manière préventive.
Une autre exception que je ferais dans .net serait quelque chose comme une classe «MutableHolder» dont le seul but est d'exposer un champ public de type «T».Envelopper des éléments de collection compatibles Interlocked dans une telle classe lorsque vous les stockez dans une collection, il sera possible d'utiliser des méthodes 'Interlocked' même si la collection ne supporte pas ce genre de choses, et envelopper les types de valeur dans ces classes permettra les modifier "directement" sans modifier la collection sous-jacente. On peut contenir plus d'un élément dans l'objet de classe en utilisant un PODS de champ exposé comme paramètre de type. –
supercat