Visibilité par défaut pour les classes et les membres C # (champs, méthodes, etc.)?


164

J'essaie de trouver une référence pour la visibilité par défaut de divers aspects de C #. Types de classes, champs, méthodes, énumérations, etc.

Quelqu'un peut-il fournir une liste de ceux-ci avec leur visibilité par défaut (c'est-à-dire, aucun modificateur préfixé)?



8
Je ne considérerais pas cela comme un double ... cette question est spécifique (Quelle est la valeur par défaut pour CECI?), Celle-ci est large (Que sont TOUTES les valeurs par défaut?)
WernerCD

Réponses:


266

Toutes les informations que vous recherchez se trouvent ici et ici (merci Reed Copsey ):

Dès le premier lien:

Les classes et structures qui sont déclarées directement dans un espace de noms (en d'autres termes, qui ne sont pas imbriquées dans d'autres classes ou structures) peuvent être publiques ou internes. Interne est la valeur par défaut si aucun modificateur d'accès n'est spécifié .

...

Le niveau d'accès pour les membres de classe et les membres de structure , y compris les classes imbriquées et les structures, est privé par défaut .

...

les interfaces par défaut sur l' accès interne .

...

Les délégués se comportent comme des classes et des structures. Par défaut, ils ont un accès interne lorsqu'ils sont déclarés directement dans un espace de noms et un accès privé lorsqu'ils sont imbriqués .


À partir du deuxième lien:

Les types de niveau supérieur , qui ne sont pas imbriqués dans d'autres types, ne peuvent avoir qu'une accessibilité interne ou publique. L' accessibilité par défaut pour ces types est interne .

Et pour les types imbriqués:

Membres de l'accessibilité des membres par défaut
---------- ----------------------------
enum public
classe privée
interface publique
struct privé

6
Une belle compilation à partir des informations de Reed, mais vous avez oublié de spécifier que ces modificateurs d'accès s'appliquent également aux méthodes.
Joel du

4
@Joel Que voulez-vous dire? Il déclare clairement «membres». Les membres étant des données et des comportements et donc inclus des méthodes.
rism

Dans le cas où des développeurs vb.net regardent cela, vb est différent. La portée par défaut pour les membres de la classe vb est Public. Enumles membres le sont également Public. Il est probablement moins déroutant d'utiliser simplement une portée explicite dans votre cas car il y a de fortes chances qu'elle soit traduite ou lue par les développeurs c # à un moment donné. La génération de code dans vb.net ne le fait malheureusement pas pour vous.
toddmo

J'ajouterai qu'une interface imbriquée dans une classe est privée, pas interne, par défaut.
Frank Bryce

13

Depuis MSDN:

Types de haut niveau , qui ne sont pas imbriqués dans d' autres types, ne peuvent avoir internalou l' publicaccessibilité. L'accessibilité par défaut pour ces types est internal.


Les types imbriqués , qui sont des membres d'autres types, peuvent avoir des accessibilités déclarées comme indiqué dans le tableau suivant.

Accessibilité des membres imbriqués par défaut et modificateurs d'accessibilité autorisés

Source: Les niveaux d' accessibilité (Référence C #) (6 Décembre th 2017)


9

Par défaut, le modificateur d'accès pour une classe est internal. Cela signifie qu'une classe est accessible dans le même assembly. Mais si nous voulons que la classe soit accessible à partir d'autres assemblys, elle doit être rendue publique.


19
Cette information était déjà présente dans les autres réponses. Vous ne devez répondre à une question, en particulier à une ancienne comme celle-ci, que lorsque vous avez des informations supplémentaires à fournir ou que vous pensez que les autres réponses sont fausses. Quoi qu'il en soit, bienvenue dans Stack Overflow.
Gorpik

Une classe n'a pas nécessairement besoin d'être rendue publique pour être rendue accessible à d'autres assemblys. On pourrait utiliser la classe InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam

0

Par défaut, c'est private. À moins qu'elles ne soient imbriquées, les classes le sont internal.


1
les énumérations ne sont-elles pas publiques par défaut?
Ryan Peters

4
@Jay: À moins qu'ils ne soient imbriqués. @Ryan: Non, les énumérations non imbriquées sont internes par défaut.
Jon Skeet

2
@Ryan: les membres d'énumération sont publics par défaut, mais l'énumération elle-même est interne.
Reed Copsey

@ReedCopsey Mais le livre dont j'apprends le dit clairement enum members are private by default, so to use them outside the enum we should declare them as public. Pouvez-vous expliquer pourquoi le livre est en contradiction avec ce que vous dites? Merci.

Quel que soit le livre @ user5794376 (clairement un compte supprimé) en train de lire, il convient de donner toutes les critiques 1 étoile si ce qu'ils disent est dans le livre est vrai. Il suffit de consulter Microsoft Docs pour savoir que les membres d'énumération sont publics par défaut et c'est pourquoi il est courant que les énumérations ne soient pas explicites sur eux.
Rodney S.Foley
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.