J'ai lu des discussions sur ce sujet et je ne comprends tout simplement pas. P>
La réponse la plus courante semble être la suivante: utilisez une propriété réadonnée pour renvoyer des données en cache, utilisez une fonction pour renvoyer des données non cachées. N'utilisez pas du tout une propriété écroyeuse, car "ça n'a pas de sens". P>
Il n'y a pas de raison de performance à cela. En IL, MyProperty existe comme OK, alors pourquoi se déranger avec des propriétés réadonnées du tout? Pourquoi ne pas simplement rendre le public variable au lieu de privé?
Alors pourquoi prendre la peine de propriétés forte> du tout? Données en cache -> Données non mises en cache -> Fonction, données d'écriture -> Sub P>
oublions tout ce qui précède et utilise des propriétés comme une fonctionnalité pratique?
Un «article» pour obtenir et définir des données. Utilisez le bon sens pour savoir si un get ne retournera pas les données en cache (éventuellement entraînant un retard). P>
-edit-
Je vois que les gens sont plus ou moins d'accord que les propriétés sont la meilleure option.
Je ne pouvais tout simplement pas comprendre pourquoi j'ai trouvé tant de discussions sur lesquelles les gens avaient préconisé contre les propriétés. P> get_myproperty code> et
SET_MYPROPERTY code> méthodes. La seule raison est apparemment que la réponse ci-dessus devrait être supposée. P>
6 Réponses :
Une bonne raison de lecture seule Les propriétés sont des valeurs calculées. Dans ce cas, il n'y a pas de variable à l'exportation.
par exemple p> dans ce cas s'il faut exposer _birthday en tant que propriété ou un champ est certainement discutable. Mais pour d'autres valeurs calculées comme l'âge, le seul moyen de les exposer comme une variable est de les stocker dans l'objet. Dans ce cas, une variable supplémentaire pour l'âge stocke essentiellement des informations redondantes. L'exposer comme des propriétés calculées a une surcharge mineure et évite de stocker des données redondantes p> p>
Il y a plus de propriétés que les propriétés automatiques. Si vous faites:
public int MyProp { get { // Do some processing return someValue; } set { // Do some processing DoMyProcess(value); } }
@Dan: Vous avez raison, pour 90% des projets que je travaille, ce n'est pas grave aussi. Comme toute autre chose, les propriétés sont un outil - utilisez-les si elles vous aident, ignorez-les s'ils ne le font pas. Cependant, les propriétés de la raison sont également soulignées, c'est la même raison pour laquelle les gens écrivent des getters et des setters en Java, ou même pourquoi les gens écrivent si (0 == foo) code> au lieu de
si (foo = = 0) code> - c'est un mécanisme de codage défensif qui devient une habitude. Beaucoup diraient que l'habitude vaut l'effort. Encore une fois, si cela vous aide, utilisez-le.
Les propriétés sont un substitut pratique pour les opérations basées sur les méthodes. Il n'y a pas de différence fonctionnelle entre une propriété-getter-Setter et une méthode qui effectue les mêmes actions; En fait, si vous regardez IL, vous verrez les accessoires de propriété remplacés par des méthodes «Obtenir» et / ou «Définir». P>
La raison la plus forte d'utiliser des propriétés pour permettre à l'encapsulation d'accès aux variables. Disons que vous écrivez une bibliothèque et vous exposez une variable code> isBlue code>. Vous distribuez la bibliothèque, tout le monde aime et l'utilise. Maintenant, il est temps de la version 2, et vous voulez faire quelque chose lorsque l'utilisateur définit isBlue code> - peut-être effectuer un chèque, peut-être mettre en cache quelque chose. Pour ce faire, vous devrez convertir la variable en une propriété ou une méthode et faire l'enregistrement là-bas. Maintenant, vous avez enfoncé tout votre code client - la variable qu'ils avaient accessible n'est plus là. Si vous l'aviez implémenté à l'origine comme une propriété, vous auriez pu simplement modifier le code de la propriété et la compatibilité binaire conservée. P>
"Données en cache -> variable publique" - mauvaise idée. Cela permettrait à une autre classe de modifier les données en cache. En outre, calculer les données de la mise en cache peut être coûteuse: l'utilisation d'une propriété en lecture seule vous permet de différer le calcul jusqu'à ce que la propriété soit accessible. P>
Il est considéré comme une mauvaise pratique pour exposer votre variable de votre classe. De plus, si vous modifiez la structure de votre objet, mais gardez vos propriétés intactes, cela n'affectera pas le code qui utilise votre classe. P>
Raison n ° 1 = Propriétés peut être utilisée dans la liaison de données. Méthodes ne peut pas. P>
Raison n ° 2 = Lorsque le débogage de la fenêtre de montre exposera automatiquement les propriétés / développer l'objet. Les méthodes ne sont pas toujours surveillées de cette façon. P>
Je me souviens de lire quelque part que la propriété de lecture ne doit pas changer l'état de l'objet. Je pense que c'est une bonne pratique à suivre surtout compte tenu de la raison n ° 2. Dès que vous regardez un objet et développez-le dans la montre que l'état des objets pourrait être changé ainsi, ce qui facilite le débogage plus difficile. P>
Également si une propriété chère est liée par accident, il peut introduire de graves problèmes de performance. (Les attributs peuvent "masquer" les propriétés de la liaison de données, mais il suffit de les faire des méthodes signifie que vous n'avez pas à vous en soucier.) P>
Les propriétés sont des commodités pour le développement de la fenêtre. Ils sont "utilisés" différemment dans les concepteurs, etc. p>
(J'expose parfois quelques variables. Mais je les nomme comme je voudrais une propriété. Donc au lieu de p>
Integer Mcounter = 0; p>
je viens de faire p>
compteur entier = 0;. p>
Si je dois faire des "affaires supplémentaires" à un moment donné à un moment donné, je crée la propriété avec le même nom et renommer la variable à McOnter. Certes, c'est la paresse de ma part et je ne le recommençais pas vraiment. Il suffit de terminer dans une propriété.) P>
Quoi, exactement, votre question est-elle? Votre dernier paragraphe contradictons votre question ou fournit votre propre réponse.
Mon dernier paragraphe fournit ma propre opinion. Je recherche un accord ou un désaccord (avec des raisons fournies).
Stackoverflow.com/Questtions/1019571/...