55 votes

Dois-je utiliser des propriétés publiques et des champs privés ou des champs publics pour les données?

Dans une grande partie du code que j'ai vu (sur soi, thecodeproject.com et j'ai tendance à le faire dans mon propre code), j'ai vu des propriétés publiques en cours de création pour chaque domaine privé qu'une classe contient, même si elles sont les plus de base type d' get; set; comme:

private int myInt;
public int MyInt 
{
     get { return myInt; }
     set { myInt = value }
}

Ma question est: comment est-ce différent de:

public int MyInt;

et si on doit utiliser des propriétés, au lieu de champs publics, pourquoi devrions-nous utiliser dans ce cas précis? (Je ne parle pas des exemples plus complexes où les getters et setters réellement faire quelque chose de spécial ou il y a un seul d'obtenir ou de définir (en lecture/écriture uniquement) plutôt que de simplement retourner/définition de la valeur d'un champ privé). Il ne semble pas supplémentaire encapsulation, ne donnent qu'une belle icône dans IntelliSense et être placé dans une section spéciale dans les diagrammes de classe!

33voto

John Nolan Points 16633

Voir cet article http://www.codinghorror.com/blog/archives/000654.html

Plus précisément

  • La réflexion fonctionne différemment entre les variables et les propriétés, donc si vous comptez sur la réflexion, il est plus facile d'utiliser toutes les propriétés.
  • Vous ne pouvez pas lier de données à une variable.
  • Changer une variable en une propriété est un changement de rupture.

22voto

Max Schmeling Points 6295

Trois raisons:

  1. Vous ne pouvez pas remplacer les champs dans les sous-classes comme vous pouvez propriétés.
  2. Vous pouvez éventuellement besoin d'un plus complexe getter et setter, mais si c'est un champ, en changeant de casser l'API.
  3. Convention. C'est juste la façon dont c'est fait.

Je suis sûr qu'il ya plus de raisons que je ne suis pas à l'esprit.

Dans .Net 3.x vous pouvez utiliser automatique des propriétés de ce type:

public int Age { get; set; }

au lieu de la old school avec la déclaration des champs privés vous-même comme ceci:

private int age;

public int Age
{
    get { return age; }
    set { age = value; }
}

Cela en fait aussi simple que de créer un champ, mais sans la casser question du changement (entre autres choses).

8voto

agnieszka Points 3668

Lorsque vous créez domaine privé nom , et une simple propriété publique Nom qui fait obtient et définit le nom du champ valeur

public string Name
{
   get { return name; }
}

et vous utilisez cette propriété partout à l'extérieur de votre classe et un jour, vous décidez que le Nom de la propriété de cette classe sont en réalité le nom du champ (ou que vous voulez retourner une chaîne de caractères "Mon nom: "+nom), il vous suffit de modifier le code à l'intérieur de la propriété:

public string Name
{
   get { return lastName; //return "My name: "+name; }
}

Si vous étiez à l'aide publique champ nom partout dans le code extérieur alors que vous auriez à changer de nom de nom partout où vous l'avez utilisé.

5voto

PatrikAkerstrand Points 23968

Eh bien, cela fait une différence. Les données publiques peuvent être modifiées sans que l'instance d'objet le sache. En utilisant des getters et setters, l'objet est toujours conscient qu'une modification a été effectuée.

N'oubliez pas que l'encapsulation des données n'est que la première étape vers une conception mieux structurée, ce n'est pas un objectif final en soi.

4voto

Pavel Podlipensky Points 3943

Vous devez utiliser des propriétés dans les cas suivants:

  1. Lorsque vous devez sérialiser des données de la propriété dans un certain format.
  2. Lorsque vous devez remplacer des propriétés dans une classe dérivée.
  3. Lorsque vous implémentez des méthodes get et set avec une certaine logique. Par exemple, lorsque vous implémentez un modèle Singleton.
  4. Lorsque vous êtes dérivé de l'interface, où la propriété a été déclarée.
  5. Lorsque vous avez des problèmes spécifiques liés à la réflexion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X