Une raison d'écrire le mot-clé «privé» en C #?

109

Pour autant que je sache, privateest la valeur par défaut partout en C # (ce qui signifie que si je ne le fais pas écrire public, protected, internal, etc. , il sera privatepar défaut). (S'il vous plait corrigez moi si je me trompe.)

Alors, quelle est la raison d'écrire ce mot-clé, ou pourquoi existe-t-il même pour les membres?

Par exemple, lorsqu'un gestionnaire d'événements est généré automatiquement, il ressemble à ceci:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Mais pourquoi écrit-il même privé si c'est implicite et par défaut? Juste pour que les développeurs novices (qui ne savent pas que c'est le C # par défaut) savent que c'est privé? Ou y a-t-il une différence pour le compilateur?

De plus, est - il un cas où l' écriture « privée » (seul) va changer l'accessibilité du membre?

Camilo Martin
la source
18
IIRC, un type "de premier niveau" sera cependant internalpar défaut.
Jeff Mercado
4
La valeur par défaut pour tout n'est pas privée, comme indiqué, et en règle générale, il vaut mieux être explicite.
James Michael Hare
1
Connexes: C # a-t
BoltClock
La valeur par défaut pour tout est «aussi privé que possible». De toute évidence, une classe non imbriquée ne peut pas être privée, ou rien ne peut l'instancier ou l'utiliser. Mais les membres sont privés par défaut et les classes imbriquées sont privées par défaut. Tout en C # a, par défaut, le niveau de visibilité le plus restreint possible.
Ryan Lundy

Réponses:

171

AFAIK, private est la valeur par défaut partout en C # (ce qui signifie que si je n'écris pas public, protected, internal, etc., ce sera privé par défaut). (veuillez me corriger si vous avez tort).

Ce n'est pas vrai. Les types définis dans un espace de noms (classes, structures, interfaces, etc.) seront internes par défaut. En outre, les membres appartenant à différents types ont des accessibilités par défaut différentes (telles que public pour les membres d'interface). Pour plus de détails, consultez Niveaux d'accessibilité sur MSDN.

Aussi,

Alors, quelle est la raison d'écrire ce mot-clé, ou pourquoi existe-t-il même?

Spécifier cela explicitement aide à indiquer votre intention de rendre le type privé, très explicitement. Cela contribue à la maintenabilité de votre code au fil du temps. Cela peut aider d'autres développeurs (ou vous-même) à savoir si un membre est privé par défaut ou exprès, etc.

Reed Copsey
la source
1
@Wayne: il a une réponse avec un score plus élevé que Jon Skeet mais il ne la mérite pas ... La réponse de Jon est beaucoup plus précise.
aleroot
2
C'est une distinction inutile. Les types dans un espace de noms sont internes par défaut car ils ne peuvent pas être privés par défaut; sinon rien ne pourrait les utiliser. Ils sont toujours aussi restreints que possible, par défaut.
Ryan Lundy
1
L'accessibilité des membres par défaut pour les classes inisde et struct est privée. Vérifiez ici: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Mais les éléments à l'intérieur d'un espace de noms ne peuvent pas l'être private.
Shimmy Weitzhandler
En outre, getet setpar défaut à l'accessibilité de la propriété elle
AustinWBryan
119

AFAIK, private est la valeur par défaut partout en C #

Pas tout à fait - la valeur par défaut est "l'accès le plus restreint disponible pour cette déclaration". Ainsi, par exemple, avec un type de niveau supérieur, la valeur par défaut est internal; pour un type imbriqué, la valeur par défaut est private.

Alors, quelle est la raison d'écrire ce mot-clé, ou pourquoi existe-t-il même?

Cela le rend explicite, ce qui est bon pour deux raisons:

  • Cela rend les choses plus claires pour ceux qui ne connaissent pas les valeurs par défaut, selon votre question (je n'ai jamais aimé cet argument, personnellement, mais j'ai pensé que cela valait la peine de le mentionner)
  • Cela donne l'impression que vous avez délibérément décidé de le rendre privé, plutôt que de simplement abandonner les valeurs par défaut.

Quant à votre dernière partie:

De plus, y a-t-il un cas où l'écriture «privée» (seule) changera l'accessibilité du membre?

Oui, pour rendre la moitié d'une propriété plus restrictive que l'autre:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

J'avais l' habitude d'utiliser des valeurs par défaut partout où je pouvais, mais j'ai été convaincu (en partie par Eric Lippert) qu'indiquer clairement que vous y avez pensé et que vous avez décidé de rendre quelque chose de privé est une bonne idée.

Personnellement, j'aurais aimé qu'il y ait un moyen de le faire pour les déclarations de type scellées / non scellées - peut-être même pas par défaut. Je soupçonne que de nombreux développeurs (moi y compris si je ne fais pas attention) laissent les classes non scellées simplement parce que c'est moins d'effort que de les sceller.

Jon Skeet
la source
+1. L'utilisation de mots-clés non pertinents pour signaler une intention sémantique est utile, bien que mon arrière-plan Java utilise finalun exemple plus typique.
jprete
1
@minitech: L'inverse fonctionne aussi, mais est moins utile. Tout cela a été introduit dans C # 2.
Jon Skeet
20
Je souhaite certainement qu'il n'y ait pas de valeurs par défaut du tout et que le compilateur a simplement renvoyé une erreur si le modificateur d'accès était manquant. Je ne pense pas que la plupart des gens sachent quelles sont les valeurs par défaut pour chaque situation, ce qui conduit alors à des erreurs involontaires.
+1 "pour un type imbriqué, la valeur par défaut est privée" - Je le sais juste quand j'ai lu votre réponse. Merci!
Nordin
5
@Phong, pour C #, il y a une règle simple: par défaut, tout est aussi privé que possible. Les éléments d'un espace de noms tels que les classes non imbriquées ne peuvent pas être privés, car rien ne peut les utiliser. Ils ne peuvent être que internes ou publics; donc par défaut, ils sont internes. Les choses à l'intérieur d'autres choses (énumérations dans une classe; classes imbriquées; propriétés; champs; méthodes ...) sont privées par défaut.
Ryan Lundy
11

privateajoute un encombrement visuel. À ceux qui insistent sur le fait que cela rend les choses explicites, je demanderais: faites-vous cela avec les mathématiques aussi? Par exemple:

var answer = a + b / c;

Trouvez-vous cela peu clair sans parenthèses redondantes b / c?

La règle en C # est très simple: par défaut, tout est aussi proche de privé que possible. Donc, si vous avez besoin que quelque chose soit plus visible que la valeur par défaut, ajoutez un modificateur. Sinon, n'ajoutez pas de mots clés inutiles à votre code.

Ryan Lundy
la source
1
J'étais d'accord avec ce droit avant de poser la question. Mais, certaines personnes écrivent VB, certains C ++, certains même F # (venant d'autres langages fonctionnels tels que Haskell peut-être?), Mieux qu'ils ne le font sur C #. Donc, pour eux (et pour nous si on oublie ça après 2 ans sans c # ing) c'est mieux si les accesseurs sont explicites. Ne sous-estimez pas l'impact de l'apprentissage facile sur un projet, de nombreux développeurs viennent d'horizons qui peuvent ne pas refléter l'outil de choix, et ils ont besoin d'aides à l'apprentissage, même en code de production, ce n'est pas mal du tout (et nous en connaissons beaucoup). code très mauvais C #, donc quelques aides nous aident aussi).
Camilo Martin
3
Eh bien, bien sûr, dans VB, les valeurs par défaut sont atroces. Je pense que la visibilité par défaut est Friendpour les membres, par exemple. C # fait sa visibilité par défaut de la bonne manière: les choses sont définies sur la moins visibilité possible à moins qu'elles ne soient modifiées. D'après ce que je suis en mesure de trouver, il semble que la même chose est vraie pour C ++ (sauf structs). (Cela ne semble pas être vrai pour F #.)
Ryan Lundy
6
C'est étrange pour moi que tant de gens soient favorables var, car cela réduit l'encombrement visuel, et pourtant tant de personnes sont en faveur de la saisie inutile private.
Ryan Lundy
2
J'irais même jusqu'à dire que l'encombrement visuel empêche la lisibilité!
binki
1
upvoted même si je ne préfère utiliser des parenthèses dans le cas de votre exemple de mathématiques.
Marc 2377
7

Autant que je sache, privé est la valeur par défaut partout en C #

Déclarer explicitement privé , signifie que vous savez qu'il est privé. Je ne pense pas que oui, car pour autant que vous le sachiez, c'est la valeur par défaut. Cela signifie également que quelqu'un d'autre qui regarde le code sait de quoi il s'agit.

Il n'y a pas « Je pense qu'il est », « Je suis sûr qu'il est », etc. Il est juste . Et tout le monde est sur la même longueur d'onde.

Je ne suis pas un développeur C # . Si je devais travailler avec un code qui n'a pas été explicitement déclaré privé , je supposerais probablement qu'il est interne .

Je n'aime pas quand les choses sont implicitement définies. Ce n'est jamais aussi clair que lorsqu'ils sont définis explicitement.

JD Isaacks
la source
Cela semble raisonnable, j'oublie même les bases des langues que je connaissais autrefois.
Camilo Martin
6

Lisibilité - Tout le monde ne sait peut-être pas que le comportement par défaut est privé.

Intention - Donne une indication claire que vous avez spécifiquement déclaré la propriété privée (pour une raison quelconque).

James
la source
5

La lisibilité, la démonstration d'intention sont deux bonnes raisons auxquelles je peux penser.

Maess
la source
D'accord. Par exemple, si vous travaillez avec d'autres développeurs sur un peu de code, définir quelque chose sur privé aide à indiquer votre intention. C'est également utile lorsque vous revenez dans votre code après un certain nombre d'années et que votre IDE peut vous dire quelles méthodes devraient être accessibles au public pour cette classe.
Aaron Newton
3

Une bonne raison de spécifier explicitement la visibilité est que vous n'ayez pas à penser à la valeur par défaut du contexte dans lequel vous vous trouvez.

Une autre bonne raison est que FxCop vous dit de le faire.

Patrick McDonald
la source
+1, je viens de remarquer que FxCop se plaignait de ma suppression du modificateur privé maintenant lorsque j'ai construit avec le changement.
Camilo Martin
2

Beaucoup de gens (des gens comme moi!) Programment régulièrement dans une poignée de langues différentes. Être explicite avec des choses comme celles-ci m'empêche d'avoir à me souvenir de tous les détails obscurs de tous les langages dans lesquels je programme.

davidtbernal
la source
1
Eh bien, je ne dirais pas que "le modificateur d'accès par défaut est private" est un détail obscur ... Mais je comprends le point. L'autre jour, j'ai eu du mal à me souvenir du fonctionnement du framework que j'ai utilisé la semaine dernière ( MEF ).
Camilo Martin
0

Je dirais pour la cohérence avec la lisibilité de la portée du reste de la classe.

MGZero
la source
4
Vous pensez à C ++. En C #, même dans les structures, les membres par défaut sont private.
3
Les structures ne sont pas accessibles au public par défaut - voir: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey