Pourquoi dois-je utiliser get et set?

J’ai un segment de code:

public class MyClass { private ssortingng _myProperty; public ssortingng MyProperty { get { return _myProperty; } set { _myProperty = value; } } } 

Quel est le point ici? J’aurais pu déclarer la chaîne _myProperty publique et tous les objects de ma classe pourront y accéder directement et obtenir ou définir la valeur.

Au lieu de cela, nous _myProperty privé et l’utilisation de get et set pour y accéder, en utilisant l’object class.

Dans les deux cas, l’object de classe peut y accéder et le résultat est toujours le même.

Alors pourquoi utiliser cette approche? Est-ce uniquement parce que je peux implémenter peu de contraintes dans setter?

En dehors de cela, quel mal rendra publique la cause des variables variables? Dans cet exemple, je pourrais exposer _myProperty comme public au lieu de le limiter à cette classe uniquement en le rendant privé, comme le suggère la programmation orientée object.

Non, le résultat n’est pas toujours le même.

  • Essayez de vous lier à un champ public (ou faites quelque chose d’autre qui utilise la reflection et attend des propriétés)
  • Essayez de passer une propriété par référence (vous ne pouvez pas)
  • Essayez plus tard de décider de vous connecter, etc. et de constater que lorsque vous le changez en propriété, vous perdez la compatibilité source et la compatibilité binary.

Lisez l’ article que j’ai écrit à ce sujet il y a quelque temps …

Notez que dès le C # 2, votre code peut être beaucoup plus court:

 public class MyClass { public ssortingng MyProperty { get; set; } } 

Le champ _myProperty est un détail d’implémentation. Il indique au compilateur que vous souhaitez stocker de la mémoire pour une référence de chaîne et lui atsortingbuer ce nom. Les méthodes get / set font partie de la propriété de l’object, ce qui explique comment la propriété MyProperty est implémentée. Par exemple, si vous souhaitez modifier le mode de stockage / récupération de la chaîne, les personnes à charge tierces ne doivent pas être recompilées.

Vous pouvez également utiliser les propriétés automatiques pour le faire pour vous:

 public ssortingng MyProperty {get; set;} 

Si vous déclarez simplement que les variables sont publiques, il ne s’agit pas réellement de propriétés. De nombreuses fonctionnalités utilisant la reflection ne fonctionneront pas, en particulier la liaison de données, la sérialisation, etc.

De temps en temps, je suis paresseux et je fais cela, en particulier lorsque je travaille dans VB.Net pre v4 car il n’existe pas de propriétés automatiques, et je le regrette toujours et je reviens pour écrire les propriétés correctement.

Il est particulièrement important d’utiliser des propriétés si votre classe doit être consommée par du code écrit par des développeurs autres que vous-même, car ils risquent d’avoir des problèmes avec les limitations imposées par le fait de ne pas coder des propriétés complètes.

Comme vous l’avez dit, la validation est la raison principale des propriétés. Chaque classe a la responsabilité de protéger ses membres et _myProperty est membre de MyClass. La façon dont .Net met en œuvre cette responsabilité est la propriété. en Java, vous devez définir deux méthodes: SetMyPropety et GetMyProperty.

Il est important de noter que s’il est souvent utile pour les classes d’encapsuler des champs dans des propriétés, il est souvent contre-productif pour les structures de le faire. Un grand nombre des limitations recommandées pour l’utilisation de structures découlent de la présomption que tous les champs de struct seront encapsulés dans des propriétés. Si la sémantique d’une structure fournit cela:

  1. Son état est complètement défini par un nombre fixe de parameters, qui sont tous exposés au public pour la lecture.
  2. Ces parameters peuvent être librement atsortingbués à n’importe quelle combinaison de valeurs qui sont légales pour leurs types respectifs.
  3. L’instance par défaut de la structure est spécifiée comme ayant tous les parameters initialisés aux valeurs par défaut de leurs types respectifs.

ensuite, l’exposition de champs exposerait le “fonctionnement interne” du type de données, mais une telle exposition n’exclurait aucune modification future significative du type de données qui ne serait pas déjà exclue par la spécification . Tous les champs de toutes les structures stockées dans des emplacements modifiables sont toujours exposés à la mutation, même si le seul moyen de mutation est une copie groupée de tous les champs publics et privés d’une instance à une autre. Si la sémantique d’une structure requirejs que le code soit capable de créer une instance dont les parameters de définition ont une combinaison de valeurs, sans ressortingction, exposer directement les champs d’une structure ne permettra pas au code à un seul thread de faire ce qu’il ne pourrait pas faire davantage lentement sans un tel access. Les seules choses qui exposent les champs permettront au code de faire ce qu’il ne pourrait pas faire autrement:

  1. exécuter plus vite
  2. exprimer plus clairement son intention
  3. ont défini la sémantique dans des scénarios multi-threading où la sémantique serait autrement trouble

Je ne vois pas vraiment l’intérêt d’obliger les consommateurs d’un type donné à fonctionner plus lentement, à être écrit maladroitement et à avoir une sémantique sombre multi-threading.

Notez que s’il existait une politique contre les structures avec des propriétés qui mutent ‘this’, plutôt qu’une politique d’encapsulation de tous les champs de structure, une instruction comme

 myListOfPoint[4].X = 5; 

serait rejetée même si la langue permettait aux propriétaires de propriétés d’être appelés sur des structures en lecture seule (avec une présomption que l’objective serait de faire des choses comme:

 myArraySegment[3] = 9; 

compris comme accédant au tableau auquel myArraySegment contient une référence).