127 votes

Une raison d'écrire le mot-clé "private" en C#?

As far as I know, private is the default everywhere in C# (meaning that if I don't write public, protected, internal, etc. it will be private by default). (Please correct me if I am wrong.)

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

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

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Mais pourquoi écrire private alors que c'est implicite et par défaut ? Juste pour que les développeurs novices (qui ne savent pas que c'est le défaut en C#) sachent que c'est private ? Ou y a-t-il une différence pour le compilateur ?

De plus, y a-t-il un cas où écrire "private" (seul) changerait l'accessibilité du membre ?

19 votes

Si je me souviens bien, un type "top-level" sera internal par défaut cependant.

5 votes

La valeur par défaut pour tout n'est pas privée, comme indiqué, et en règle générale, il est préférable d'être explicite.

1 votes

181voto

Reed Copsey Points 315315

À ma connaissance, 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 je me trompe).

Ce n'est pas vrai. Les types définis dans un espace de noms (classes, structs, interfaces, etc.) seront internal par défaut. De plus, les membres au sein de 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 permet de marquer votre intention de rendre le type privé, de manière très explicite. Cela aide à maintenir la lisibilité de votre code dans le temps. Cela peut aider d'autres développeurs (ou vous-même) à savoir si un membre est privé par défaut ou intentionnellement, etc.

1 votes

@Wayne : il a une réponse avec un score plus élevé que Jon Skeet mais il ne le mérite pas... La réponse de Jon est beaucoup plus précise.

6 votes

Il s'agit d'une distinction sans intérêt. Les types au sein d'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 restent aussi restreints que possible, par défaut.

1 votes

L'accessibilité des membres par défaut pour les classes et les structures à l'intérieur est privée. Vérifiez ici: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx

132voto

Jon Skeet Points 692016

À ma connaissance, private est la valeur par défaut partout en C#

Pas vraiment - la valeur par défaut est "l'accès le plus restreint disponible pour cette déclaration". Par exemple, pour un type de premier niveau, 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?

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, comme dans votre question (je n'ai jamais aimé cet argument, personnellement, mais je pense que cela vaut la peine d'être mentionné)
  • Cela donne l'impression que vous avez délibérément décidé de le rendre privé, plutôt que de simplement suivre les valeurs par défaut.

En ce qui concerne la dernière partie de votre question:

De plus, existe-t-il un cas où l'écriture de "private" (seul) modifiera l'accessibilité du membre?

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

// Getter public, setter public
public int Foo { get; set; }

// Getter public, setter privé
public int Bar { get; private set; }

Je avais l'habitude de suivre les valeurs par défaut partout où je le pouvais, mais j'ai été convaincu (en partie par Eric Lippert) que rendre explicite le fait que vous avez réfléchi et décidé de rendre quelque chose privé est une bonne idée.

Personnellement, je souhaiterais qu'il y ait un moyen de faire cela pour les déclarations scellées/non scellées, aussi, pour les déclarations de type - peut-être même ne pas avoir de valeur 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 juste parce que c'est moins d'effort que de les rendre scellées.

0 votes

+1. Utiliser des mots-clés sinon sans importance pour indiquer une intention sémantique est utile, bien que mon expérience en Java rende l'utilisation de final un exemple plus typique.

1 votes

@minitech: L'autre sens fonctionne aussi, mais est moins utile. Tout cela a été introduit en C# 2.

24 votes

Je souhaite vraiment qu'il n'y ait aucun paramètre par défaut et que le compilateur renvoie simplement une erreur si le modificateur d'accès est manquant. Je ne pense pas que la plupart des gens sachent quels sont les paramètres par défaut pour chaque situation, ce qui conduit ensuite à des erreurs non intentionnelles.

7voto

JD Isaacks Points 14540

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

Déclarer explicitement privé, signifie que vous savoir que c'est privé. Pas seulement penser que c'est, car autant que vous savez, c'est la valeur par défaut. Cela signifie également que quelqu'un d'autre qui regarde le code sait ce que c'est.

Il n'y a pas de "je pense que c'est", "je suis à peu près sûr que c'est", etc. C'est simplement. 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 du code qui n'était pas explicitement déclaré privé, je supposerais probablement que c'était interne.

Je n'aime pas quand les choses sont implicitement définies. Ce n'est jamais aussi clair que lorsque c'est explicitement défini.

0 votes

Cela semble raisonnable, j'ai même oublié les bases des langues que je connaissais autrefois mieux.

0 votes

"Je n'aime pas lorsque les choses sont implicitement définies. Ce n'est jamais aussi clair que lorsqu'elles sont explicitement définies, n'est-ce pas? Mais n'y a-t-il pas comme un milliard de choses implicites dans le code de programme? N'utilisons-nous pas des langages de haut niveau, des bibliothèques, du sucre syntaxique et des valeurs par défaut saines pour ne pas avoir à penser et à déclarer tous les détails? Dans mon livre, moins de détails et de code est meilleur et l'emporte sur le fait d’être explicite pour le simple plaisir de l'être. Ne pas écrire "private" c'est comme "var"."

7voto

James Points 40024

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

Intention - Donne une indication claire que vous avez spécifiquement déclaré la propriété private (pour une raison particulière).

6voto

Maess Points 2342

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

0 votes

D'accord. Par exemple, si vous travaillez avec d'autres développeurs sur un morceau de code, définir quelque chose comme privé aide à indiquer votre intention. C'est également utile lorsque vous revenez dans votre code après plusieurs années et que votre IDE peut vous dire quels méthodes devraient être accessibles publiquement pour cette classe.

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