406 votes

Champs publics et propriétés automatiques

On nous a souvent dit, il faut protéger l'encapsulation en faisant des accesseurs et des mutateurs (propriétés en C#) pour les champs de la classe, au lieu d'exposer les champs vers le monde extérieur.

Mais il y a beaucoup de fois où un terrain est juste là pour contenir une valeur et ne nécessite aucun calcul pour obtenir ou définir. Pour cela, nous ferions de ce numéro:

public class Book
{
    private string _title;

    public string Title
    {
          get{ return _title;  }
          set{ _title = value; }
    }
}

Eh bien, j'ai une confession, je ne pouvais pas supporter l'écriture de tout ce qui (vraiment, c'est de n'avoir rien à écrire, il est obligé de le regarder), je suis donc allé voyous et utilisé les champs.

Puis vient le long de C# 3.0 et je vois qu'ils ajouté automatique des propriétés:

public class Book
{
    public string Title {get; set;} 
}

ce qui est plus propre, et je suis reconnaissant pour ça, mais vraiment, ce qui est si différent que de simplement faire un champ public?

public class Book
{
    public string Title;
}

197voto

Michael Stum Points 72046

Dans une question connexe, j'ai eu il y a quelques temps, il y avait un lien vers une publication sur le blog de Jeff, à expliquer certaines différences.

Propriétés vs Variables Publiques

  • La réflexion fonctionne différemment sur les variables contre les propriétés, de sorte que si vous vous fiez à la réflexion, il est plus facile d'utiliser toutes les propriétés.
  • Vous ne pouvez pas databind à l'encontre d'une variable.
  • La modification d'une variable à une propriété est une modification importante.

94voto

JaredPar Points 333733

Ignorant les problèmes d'API, la chose que je trouve les plus précieux sur l'utilisation de la propriété est de débogage.

Le CLR débogueur ne prend pas en charge les données des points de rupture (la plupart des débogueurs natifs). Par conséquent, il n'est pas possible de définir un point d'arrêt sur la lecture ou d'écriture d'un champ sur une classe. C'est très limitant dans certains scénarios de débogage.

Parce que les propriétés sont mises en œuvre que très mince méthodes, il est possible de définir des points d'arrêt sur la lecture et l'écriture de leurs valeurs. Cela leur donne une grande jambe sur les champs.

81voto

Rex M Points 80372

La modification d'un champ à une propriété rompt le contrat (par exemple, exige que tous le référencement du code pour être recompilé). Ainsi, lorsque vous avez un point d'interaction avec d'autres classes - tout public (et généralement protégés) membre, vous voulez un plan de croissance pour l'avenir. Le faire en utilisant toujours des propriétés.

Il n'est rien que d'en faire une auto-aujourd'hui, la propriété, et 3 mois en bas de la ligne, réalisez que vous voulez faire chargement paresseux, et de mettre un null vérifier dans la lecture. Si vous aviez utilisé un champ, c'est une recompilation du changement, au mieux, et de l'impossible, au pire, en fonction de qui et de quoi d'autre s'appuie sur vos assemblées.

68voto

MartinStettner Points 14514

Juste parce que personne ne l'a mentionné: Vous ne pouvez pas définir de champs sur les interfaces. Donc, si vous devez implémenter une interface spécifique qui définit les propriétés, les auto-propriétés sont parfois une fonctionnalité très intéressante.

57voto

Zaid Masud Points 4536

Une énorme différence qui est souvent négligée et n'est mentionnée dans aucune autre réponse: dérogatoire . Vous pouvez déclarer les propriétés virtuelles et les remplacer, alors que vous ne pouvez pas faire de même pour les champs de membres publics.

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