Question

Considérant " privé " est le modificateur d'accès par défaut pour les membres de la classe, pourquoi le mot clé est-il même nécessaire?

Était-ce utile?

La solution

C'est pour vous (et les futurs responsables), pas le compilateur.

Autres conseils

Il y a une certaine quantité de désinformation ici:

  

" Le modificateur d'accès par défaut n'est pas privé mais interne "

Eh bien, cela dépend de ce dont vous parlez. Pour les membres d'un type, c'est privé. Pour les types de niveau supérieur eux-mêmes, c'est interne.

  

"Privé n'est que la valeur par défaut pour les méthodes sur un type "

Non, il s'agit de la valeur par défaut pour tous les membres d'un type: propriétés, événements, champs, opérateurs, constructeurs, méthodes, types imbriqués et tout ce que j'ai oublié.

  

" En fait, si la classe ou la structure n'est pas déclarée avec un modificateur d'accès, sa valeur par défaut est internal "

Uniquement pour les types de niveau supérieur. Pour les types imbriqués, c'est privé.

Hormis pour limiter l'accès aux propriétés d'une partie mais pas de l'autre, la valeur par défaut est toujours "aussi restrictive que possible".

Personnellement, j’ai hésité sur la question de savoir s’il faut être explicite. Le " pro " L’utilisation de la valeur par défaut est que cela indique que vous faites quelque chose de plus visible que le niveau le plus restrictif. Le " pro " car le spécifier explicitement, c’est que c’est plus évident pour ceux qui ne connaissent pas la règle ci-dessus, et cela montre que vous y avez un peu réfléchi.

Eric Lippert utilise la forme explicite, et je commence aussi à me pencher de cette façon.

Voir http://csharpindepth.com/ViewNote.aspx?NoteID=54 pour un peu plus à ce sujet.

Explicitness. Je n'utilise jamais la valeur par défaut et ajoute toujours explicitement le modificateur.

Cela pourrait être dû à mon arrière-plan Java où la valeur par défaut était 'package' (à peu près équivalente à 'internal' en C #) et la différence me dérangeait donc toujours. J'ai trouvé l'explicite préférable.

J'utilise aussi maintenant ReSharper qui, par défaut, est explicite. Ainsi, cela ne fait que confirmer et renforcer mon parti pris:)

Le modificateur privé explique l'intention.

Une variable membre privée n'est pas destinée à une manipulation directe en dehors de la classe. Les accesseurs get / set peuvent être créés ou non pour la variable.

Une méthode privée n'est pas destinée à être utilisée en dehors de la classe. Cela peut être pour la fonctionnalité interne seulement. Vous pouvez également rendre un constructeur par défaut privé pour empêcher la construction de la classe sans transmettre de valeurs.

Le modificateur privé (et d’autres similaires) peut être un moyen utile d’écrire du code auto-documentant.

Comme l’a souligné Jon Skeet dans son livre C # In Depth , il existe un endroit dans C # où le mot clé privé est requis pour obtenir un effet.

Si ma mémoire est bonne, le mot-clé private est le seul moyen de créer un getter ou un setter de propriété privée, lorsque son contraire est supérieur à l'accessibilité privée. Exemple:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

Le mot-clé privé est requis pour y parvenir, car un modificateur supplémentaire d'accessibilité de propriété ne peut que réduire la portée, pas l'élargir. (Sinon, on aurait pu créer une propriété privée (par défaut) puis ajouter un modificateur public.)

Privé n'est que la méthode par défaut pour les méthodes sur un type, mais le modificateur private est utilisé ailleurs.

De la Spécification du langage C # 3.0 (msdn) , section 3.5. 1

  

En fonction du contexte dans lequel une déclaration de membre a lieu, seuls certains types d'accessibilité déclarée sont autorisés. De plus, lorsqu'une déclaration de membre n'inclut aucun modificateur d'accès, le contexte dans lequel la déclaration a lieu détermine l'accessibilité déclarée par défaut.

     
      
  • Les espaces de noms ont implicitement une accessibilité déclarée publique. Aucun modificateur d'accès n'est autorisé dans les déclarations d'espace de noms.
  •   
  • Les types déclarés dans des unités de compilation ou des espaces de noms peuvent avoir une accessibilité et une valeur déclarées publiques ou internes.   à l'accessibilité déclarée interne.
  •   
  • Les membres de la classe peuvent avoir l’un des cinq types d’accessibilité déclarée et d’accessibilité déclarée par défaut. (Notez qu'un type déclaré en tant que membre d'une classe peut avoir l'un des cinq types d'accessibilité déclarée, alors qu'un type déclaré en tant que membre d'un espace de noms ne peut avoir qu'une accessibilité déclarée publique ou interne.)
  •   
  • Les membres de structures peuvent avoir une accessibilité déclarée publique, interne ou privée et une accessibilité déclarée privée par défaut, car les structures sont implicitement scellées. Les membres de structure introduits dans une structure (c'est-à-dire qui ne sont pas hérités de cette structure) ne peuvent pas avoir une accessibilité déclarée interne protégée ou protégée. (Notez qu'un type déclaré en tant que membre d'une structure peut avoir une accessibilité déclarée publique, interne ou privée, alors qu'un type déclaré en tant que membre d'un espace de noms ne peut avoir qu'une accessibilité déclarée publique ou interne.)
  •   
  • Les membres de l'interface ont implicitement une accessibilité déclarée publique. Aucun modificateur d'accès n'est autorisé sur les déclarations de membre d'interface.
  •   
  • Les membres de l'énumération ont implicitement une accessibilité déclarée publique. Aucun modificateur d'accès n'est autorisé dans les déclarations de membre d'énumération.
  •   

Pour être complet. Et certaines personnes préfèrent être explicites dans leur code sur les modificateurs d'accès à leurs méthodes.

Pour la symétrie et pour se conformer à des styles de codage qui aiment tout pour être explicite (personnellement, je l'aime ...)

L'utilisation de private indique explicitement votre intention et laisse des indices à d'autres utilisateurs qui prendront en charge votre code;)

Certains styles de codage recommandent de placer tous les éléments "public". les éléments en premier, suivis de l'option "privé". articles. Sans un "privé" mot-clé, vous ne pouvez pas le faire de cette façon.

Mise à jour: je n'ai pas remarqué le " c # " balise sur ce donc ma réponse s'applique plus à C ++ qu'à C #.

Je laisse généralement des contacts privés, mais je le trouve utile pour aligner le code:

private   int    x;
public    string y;
protected float  z;

VS:

int x;

public    string y;
protected float  z;

Comme Robert Paulson a déclaré dans sa réponse, le private n'est pas utilisé uniquement sur les membres, mais également sur les types . Cela devient important car la valeur par défaut pour les types est internal , ce qui peut provoquer des fuites involontaires si vous utilisez InternalsVisibleToAttribute .

En fait, si la classe ou la structure n'est pas déclarée avec un modificateur d'accès, sa valeur par défaut est internal.

Donc si vous voulez le rendre privé, utilisez privé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top