5 votes

propriété : méthode privée ou get/set privé ?

Si je veux définir ma propriété dans une classe privée, de sorte qu'il devrait être seulement possible d'utiliser et de définir cette propriété dans cette classe, quelle est la meilleure façon ? Voici

public string Name { private get; private set }

o

private string Name { get; set }

hmmm et il y a aussi

private string Name { private get; private set }

17voto

Jon Hanna Points 40291

Il convient de noter qu'à l'origine, le C# ne vous permettait pas de définir des accès différents sur un getter ou un setter, de sorte que les seuls choix possibles étaient les suivants :

public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }

(D'ailleurs, il n'est pas possible d'avoir des propriétés automatiques et il faut toujours faire soi-même l'écriture vers et depuis un champ de sauvegarde, mais nous allons ignorer cela parce que nous aurons des exemples plus courts de cette façon).

Il est souvent utile d'avoir des accès différents pour les deux, le plus souvent un setter plus restrictif qu'un getter, et ainsi les exemples de

public string Name { get; private set; }

a été introduit.

Maintenant, par extension de cela, il semblerait assez logique de permettre :

public string Name { private get; private set; }
private string Name { private get; private set; }

Cependant, que sont ces deux expressions ?

Le second n'est pas trop mauvais, il est juste inutilement répétitif. Pourtant, il est fort probable qu'une réflexion confuse nous ait conduits là (très probablement une refactorisation incomplète). Un bon code consiste autant à exprimer ce que vous faites qu'à faire faire quelque chose à un ordinateur (voire plus), mieux vaut qu'il soit exprimé clairement.

Donc, si vous vous retrouvez avec des gens comme { private get; private set; } alors cela vaudrait probablement la peine de le revoir et de réfléchir à ce que vous voulez vraiment dire ici. Heureusement que c'est une erreur de compilation.

Le premier cas est encore pire. Il dit "cette propriété est publique, sauf pour le setter qui est privé, et le getter qui est privé". Ce n'est pas une exception, "c'est cette chose, sauf tout le temps" n'est pas une expression réelle de quoi que ce soit. Doublement bravo au compilateur pour ne pas nous laisser faire.

9voto

Jeppe Stig Nielsen Points 17887

Avez-vous essayé de compiler vos exemples ? Seul celui du milieu est traduit.

Si vous voulez spécifier un mot-clé de niveau d'accessibilité supplémentaire, vous ne pouvez le faire que sur l'un des accesseurs (getter/setter), et ce niveau de l'accesseur doit être plus restrictif que l'accessibilité de la propriété entière.

Voici les règles : Restriction de l'accessibilité

1voto

Mr Gray Points 2318
public string Name { get; private set; }

Je pense que c'est ce que vous voulez faire.

Il est inutile d'essayer de rendre le get privé lorsque la propriété est publique, à moins que vous ne vouliez que votre classe soit la seule à la voir. Dans cette situation, vous devriez utiliser :

private string Name { get; set; }

Mise à jour : En deuxième lecture, vous voulez vraiment le deuxième exemple.

0voto

Tigran Points 41381

Le meilleur moyen dépend de ce que vous voulez :

public string Name { private get; private set } La propriété est public mais personne peut lire ou écrire dessus, sauf la classe elle-même. C'est complètement inutile, donc utilisez simplement private string Name { get; set } .

En général, si vous considérez la propriété comme un couple de méthodes (ce qui est en fait le cas)

private string get_Name() {  }

private string set_Name(value) {  }

La raison d'avoir la possibilité d'appliquer ces identifiants à une propriété get/set devient évident, je l'espère.

0voto

user1958681 Points 211

Pour un membre privé, il n'est pas nécessaire de définir des accesseurs. Faites simplement ceci :

private string _name;

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