2009-07-02 7 views
3

Si j'ai une configuration simple de classe comme ceci:Utilisez-vous des membres de données ou des propriétés publiques dans la classe elle-même?

class MyClass 
{ 
    private string _myName = string.Empty; 

    public string MyName 
    { 
     get 
     { 
      return _myName; 
     } 
    } 

    public void DoSomething() 
    { 
     // Get the name... 
     string name = string.Empty; 

     name = _myName; 

     // OR 

     name = MyName; 

     // ...and do something with it... 
    } 
} 

Que dois-je utiliser, la propriété publique ou le membre de données?

De toute évidence, dans cet exemple, cela ne fait aucune différence, car ils se contentent de référencer la même variable. Mais qu'en est-il des utilisations réelles des propriétés publiques?

En général, les propriétés publiques fonctionnent-elles très peu, auquel cas vous pouvez les appeler? Ou les gens mettent-ils beaucoup de fonctionnalités dans leurs propriétés publiques qui ne devraient pas être appelées par des références de classe internes?

J'ai vu quelque chose dans un autre article sur NE PAS mettre beaucoup de fonctionnalités dans les propriétés, car les examiner dans le débogueur peut produire des résultats inattendus. Est-ce vrai?

+0

duplication possible de [Quel est le meilleur moyen d'accéder aux propriétés de la même classe, via des accesseurs ou directement?] (Http://stackoverflow.com/questions/355787/what-is-the-best-way-to -access-properties-from-the-même-class-through-accessors-or) – nawfal

Répondre

8

Utilisez la propriété - toute logique qui peut être encapsulée dans les setters et les getters doivent s'appliquer, même dans la classe elle-même. S'il n'y a pas de logique chez les getters et les setters, il n'est pas prudent d'utiliser les champs eux-mêmes car si vous voulez ajouter de la logique autour de l'accès à ces champs, vous devrez refactoriser beaucoup plus.

+0

réponse parfaite. –

0

Si je ne fais que renvoyer la valeur de la variable interne, je rends la variable public - il n'y a pas de mal à le faire. J'ai toujours utilisé les propriétés publiques lorsque je voulais faire quelque chose en réponse à une visualisation ou à un changement de la valeur - par exemple, l'écrire dans une base de données, définir quelque chose d'autre (comme dans la deuxième partie de votre exemple).

La question que vous devez vous poser est de savoir si vous voulez que ce qui se passe dans votre classe déclenche ces événements. Si vous le faites, de la même manière qu'un appelant externe, accédez aux valeurs via la propriété. Si vous voulez juste lire la valeur, utilisez la variable interne.

Pour répondre à votre question, il n'y a aucun mal à le faire de toute façon - juste la considération des effets secondaires potentiels.

+4

Les champs publics sont une mauvaise idée. Ils sont une exposition de l'état de la classe qui brise l'encapsulation. Pourquoi est-ce une mauvaise chose? Que se passe-t-il lorsque vous voulez ajouter de la logique autour de l'obtention ou du réglage de ce champ? Vous ne pouvez pas faire cela puisque vous avez exposé le champ lui-même. –

+0

Pourquoi ne pourriez-vous pas plus tard convertir le champ public à une propriété si vous deviez ajouter une certaine logique? Cela m'a toujours semblé inutile quand quelqu'un utilise une propriété publique et n'a pas besoin de - il semble que cela ne ferait qu'ajouter des frais supplémentaires. Au moins dans VB, il n'y a pas de syntaxe rapide "get-set", donc en faire une propriété semble impliquer plus de code que ça en vaut la peine. Je suis heureux d'avoir tort, alors remplissez-moi! – SqlRyan

5

Je crois que vous devriez faire référence à la propriété en tant que pratique générale. Alors que dans cet exemple particulier, cela ne fait pas vraiment de différence, les accesseurs get/set offrent la possibilité de faire un peu plus de travail en saisissant une propriété. Par exemple, beaucoup de nos propriétés "get" accesseurs effectuent une recherche dans une structure de données plus complexe ou définissent des valeurs par défaut si rien n'a été défini. Pour que le reste de la classe puisse profiter de cette logique, nous prenons l'habitude d'utiliser les propriétés. Juste pour que nous n'ayons pas à y réfléchir trop, nous essayons de généraliser la pratique.

Il peut y avoir des cas dans lesquels nous voulons accéder directement au membre de données sous-jacent, mais alors c'est une décision consciente avec une raison spécifique et il a tendance à être l'exception.

2

Je préfère les propriétés car elles traitent facilement les situations en lecture seule et il est facile de les emballer avec toute validation de base que vous pourriez avoir besoin de faire.

Questions connexes