2009-02-18 7 views
2

Disons que j'ai une classe qui expose une propriété. Est-il considéré comme une bonne approche d'utiliser la «variable de détenteur» privée pour usage interne dans la classe? Ou devrais-je utiliser la propriété pour un usage interne aussi.Utilisation interne de classe des propriétés publiques

Pour expliquer, dois-je utiliser:

public class foo 
{ 
    String _statusHolder; 
    public String myStaus 
    { 
     get { return _statusHolder; } 
     set{ _statusHolder = value; } 
    } 

    public void DisplayMyStatus() 
    { 
     Console.WriteLine(_statusHolder); 
    } 
} 

Ou:

public class foo 
{ 
    String _statusHolder; 
    public String myStaus 
    { 
     get { return _statusHolder; } 
     set{ _statusHolder = value; } 
    } 

    public void DisplayMyStatus() 
    { 
     Console.WriteLine(myStaus); 
    } 
} 

je pouvais voir comme beeing plus cohérente et plus lisible à utiliser la deuxième approche. Ce serait aussi plus efficace si je faisais plus tard quelques modifications dans l'instruction set. Mais y a-t-il des problèmes de performance ou est-ce considéré comme une mauvaise pratique pour une raison quelconque?


EDIT:

Il semble que tout le monde se penche vers l'utilisation de la propriété interne. Mes pensées initiales étaient les mêmes, mais en tant que programmeur novice, vous ne pouvez jamais savoir. Merci à tous pour vos commentaires rapides!

Répondre

2

J'ai tendance à aller d'appeler les propriétés causer une fois des choses devient délicat, vous pouvez mettre dans le verrouillage et la logique métier dans le getter

pour C# 3.0 Je voudrais aller avec quelque chose le long de ces lignes (et seulement créer explicitement le soutien sur le terrain quand il est vraiment nécessaire)

public class foo 
{ 

    public String Status 
    { 
     get; 
     set; 
    } 

    public void DisplayMyStatus() 
    { 
     Console.WriteLine(Status); 
    } 
} 
+0

Notez que dans cet exemple, il est possible de définir explicitement le setter private.Ainsi, la variable ne peut être écrite que par des membres de ce type. –

3

problèmes de performance devraient être negligable, comme le JITer ou le compilateur se fera un plaisir de travailler que votre appel de fonction (le getter de la propriété) ne fait pas quelque chose d'excitant, et peut être inline .

L'avantage est de futurs changements de logique métier qui pourraient être mis dans le getter, dont votre classe va alors automatiquement profiter, sans trop refactoriser. Bien sûr, l'inconvénient est que vous voudrez peut-être éviter cette nouvelle logique dans certaines circonstances, c'est donc quelque chose qui doit être considéré en fonction de la probabilité que la logique change, et b) cette logique pourrait avoir besoin être contourné.

L'autre avantage (potentiel) de l'utilisation interne de la propriété est que vous pouvez facilement passer de ou à partir de propriétés automatiques.

+0

Les problèmes de performances sont quelque peu négligeables. Si vous profilez votre code, vous verrez qu'il gaspille quelque chose entre 1-5% CPU sur les propriétés fréquemment consultées. Ce problème est subtil car le compilateur JIT optimisera uniquement le code (inline) lorsque le programme n'est pas lancé avec un débogueur attaché. –

+0

Si un profileur instrumentalise des getters de propriété, afin de vous dire combien de temps CPU est passé sur eux, alors cela affectera s'ils sont en ligne, ou sinon optimisés. C'est une chose très difficile à mesurer. –

+0

+1 pour indiquer que le code interne peut ne pas vouloir accéder à la logique métier associée à une propriété. Je souhaite vraiment que C# ait donné des noms utilisables aux champs de sauvegarde associés aux auto-propriétés, afin que le code qui contournerait la logique susceptible d'être contenue dans les futurs gestionnaires de propriété puisse utiliser directement les champs de sauvegarde. devrait dans de nombreux cas valider tous les arguments, puis définir tous les champs de sauvegarde, puis effectuer toutes les notifications de mise à jour). – supercat

2

Utilisez la propriété s'il y en a une. Une propriété peut avoir des effets secondaires comme l'initialisation paresseuse que vous voulez avoir quel que soit l'endroit où vous accédez à la variable.

Même si la propriété n'a pas d'effets secondaires maintenant, d'autres développeurs pourraient les ajouter plus tard, et les endroits où la variable "brute" est utilisée peuvent être sujettes aux erreurs parce que le nouveau code n'est pas appelé. Enfin, la propriété facilite le refactoring, par exemple lorsque la valeur ultérieure n'est plus stockée dans une variable mais est calculée dans l'accesseur de propriété ou provient d'une autre variable source.

1

Programmation en Java, je préfère utiliser la méthode getter parce que je peux y mettre un point d'arrêt et/ou voir les changements dans la sortie de journalisation.

Questions connexes