80 votes

Getters et setters auto-implémentés vs champs publics

Je vois beaucoup d'exemple de code pour les classes C# qui fait cela:

public class Point {
    public int x { get; set; }
    public int y { get; set; }
}

Ou, dans le plus ancien code, le même, avec un explicite privé de la sauvegarde de la valeur et sans les nouvelles propriétés implémentées automatiquement:

public class Point {
    private int _x;
    private int _y;

    public int x {
        get { return _x; }
        set { _x = value; }
    }

    public int y {
        get { return _y; }
        set { _y = value; }
    }
}

Ma question est pourquoi. Est-il une différence fonctionnelle entre le faire ci-dessus et juste pour s'ces membres champs publics, comme ci-dessous?

public class Point {
    public int x;
    public int y;
}

Pour être clair, je comprends la valeur de getters et setters lorsque vous avez besoin de faire de la traduction des données sous-jacentes. Mais dans le cas où vous êtes juste de passage de la valeur au travers, il semble inutilement verbeux.

53voto

Dexter Points 7001

Je suis plutôt d'accord (qu'il semble inutilement verbeux), bien que cela a été un problème, notre équipe n'a pas encore résolu et donc nos normes de codage de toujours insister sur verbose propriétés pour toutes les classes.

Jeff Atwood traitée il y a quelques années. Le point le plus important, il rétrospectivement à noter, c'est que la modification d'un champ d'une propriété est une rupture de changement dans votre code, tout ce qu'il consomme doivent être recompilés pour travailler avec la nouvelle interface de classe, donc, si quelque chose en dehors de votre contrôle est la consommation de votre classe, vous pourriez avoir des problèmes.

31voto

Brad Wilson Points 22910

C'est aussi beaucoup plus simple de le changer plus tard:

 public int x { get; private set; }
 

10voto

Joseph Daigle Points 16429

Il encapsule la configuration et l'accès de ces membres. Si à partir de maintenant, un développeur du code doit modifier la logique lorsqu'un membre est accédé ou défini, cela peut être fait sans modifier le contrat de la classe.

8voto

Rob Pilkington Points 344

L'idée est que, même si les données sous-jacentes de la structure doit changer, l'interface publique de la classe n'ont pas à être changé.

C# peut traiter les propriétés et les variables différemment à la fois. Par exemple, vous ne pouvez pas passer propriétés ref ou des paramètres de sortie. Donc, si vous avez besoin de changer la structure de données pour une raison quelconque et que vous avez été en utilisant les variables et maintenant, vous devez utiliser les propriétés, votre interface devra changer et maintenant le code qui accède à la propriété x ne peut plus compiler comme il l'a fait quand il a été variable x:

Point pt = new Point();
if(Int32.TryParse(userInput, out pt.x))
{
     Console.WriteLine("x = {0}", pt.x);
     Console.WriteLine("x must be a public variable! Otherwise, this won't compile.");
}

En utilisant les propriétés de la start permet d'éviter cela, et vous pouvez vous sentir libre de modifier l'implémentation sous-jacente comme beaucoup comme vous devez sans casser le code du client.

5voto

YordanGeorgiev Points 1222

Setter and Getter vous permet d'ajouter une couche d'abstraction supplémentaire et, en pure POO, vous devez toujours accéder aux objets via l'interface qu'ils fournissent au monde extérieur ...

Considérez ce code, qui vous sauvera dans asp.net et qui ne serait pas possible sans le niveau d’abstraction fourni par les setters et les getters:

 class SomeControl
{

private string _SomeProperty  ;
public string SomeProperty 
{
  if ( _SomeProperty == null ) 
   return (string)Session [ "SomeProperty" ] ;
 else 
   return _SomeProperty ; 
}
}
 

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