Quel est le modificateur d'accès par défaut pour les classes, méthodes, membres, constructeurs, délégués et interfaces?
L'accès par défaut pour tout dans C # est "l'accès le plus restreint que vous puissiez déclarer pour ce membre" .
Donc par exemple:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
est équivalent à
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
La seule exception à cette règle consiste à restreindre l'accès à une partie d'une propriété (généralement le créateur) par rapport à l'accessibilité déclarée de la propriété elle-même:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Voici ce que dit la spécification C # 3.0 (section 3.5.1):
En fonction du contexte dans lequel un la déclaration du membre a lieu, seulement certains types de déclarés l'accessibilité est autorisée . En outre, lors de la déclaration d'un membre n'inclut aucun modificateur d'accès, le contexte dans lequel la déclaration a lieu détermine la valeur par défaut accessibilité déclarée.
- Les espaces de noms ont implicitement une accessibilité déclarée publique. Pas d'accès les modificateurs sont autorisés sur l'espace de noms déclarations.
- Les types déclarés dans des unités de compilation ou des espaces de noms peuvent avoir public ou accessibilité déclarée interne et défaut à interne déclaré accessibilité.
- Les membres du groupe peuvent avoir l’un des cinq types d’accessibilité déclarée et default à private déclaré accessibilité. (Notez qu'un type Déclaré en tant que membre d'une classe peut Avoir l'un des cinq types déclarés Accessibility, alors qu'un type déclaré En tant que membre d'un espace de noms peut avoir seulement public ou interne déclaré accessibilité.)
- Les membres de la structure peuvent avoir des déclarations publiques, internes ou privées déclarées accessibilité et défaut à private accessibilité déclarée car structs sont implicitement scellés. Membres de la structure introduit dans une structure (c'est-à-dire, pas hérité de cette structure) ne peut pas avoir protégé ou protégé interne accessibilité déclaré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 .__ peut avoir uniquement public ou interne déclaré accessibilité.)
- Les membres de l'interface ont implicitement une accessibilité déclarée publique. Non les modificateurs d'accès sont autorisés sur déclarations de membres d'interface.
- Les membres de l'énumération ont implicitement accès public déclaré. Non les modificateurs d'accès sont autorisés sur déclarations de membres d'énumération.
(Notez que les types imbriqués entrent dans les parties "membres de la classe" ou "membres de la structure" - et par conséquent sur la visibilité privée.)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
Réponse courte: accès minimal possible (cf. réponse de Jon Skeet).
Longue réponse:
_ {Non imbriqué types, énumération et accessibilité des délégués (peut uniquement avoir une accessibilité interne ou publique)
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
Nested type et accessibilité des membres
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | public | none class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ Tous === public, protégé, interne, privé, protégé interne
² Les structures ne peuvent pas hériter de structures ou de classes (bien qu'elles le puissent, d'interfaces), donc protégé n'est pas un modificateur valide
L'accessibilité d'un type imbriqué dépend de son domaine d'accessibilité, qui est déterminé à la fois par l'accessibilité déclarée du membre et par le domaine d'accessibilité du type qui le contient immédiatement. Cependant, le domaine d'accessibilité d'un type imbriqué ne peut pas dépasser celui du type contenant.
Remarque: CIL a également la disposition pour protégé et interne (par opposition à la protection existante "ou" interne), mais à ma connaissance, ceci n'est pas disponible pour une utilisation en C #.
Voir:
http://msdn.Microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.Microsoft.com/en-us/library/ms173121.aspx
http://msdn.Microsoft.com/en-us/library/cx03xt0t.aspx
(Man I love Microsoft URIs ...)
Regardez Modificateurs d'accès (Guide de programmation C #)
Accessibilité des classes et des structures
Interne est la valeur par défaut s'il n'y a pas d'accès modificateur est spécifié.Accessibilité des classes et des membres de la structure
Membres de classe (y compris les classes et les structures imbriquées) peut être déclaré avec l’un des cinq types d'accès. Les membres de la structure ne peuvent pas être déclaré comme protégé parce que Les structures ne supportent pas l'héritage.L'accessibilité d'un membre peut ne jamais être plus grand que le accessibilité de son type conteneur
Les opérateurs définis par l'utilisateur doivent toujours être déclaré public. Pour plus informations, voir opérateur (référence C # ).
Les destructeurs ne peuvent pas avoir l'accessibilité modificateurs.
Autres types
Les interfaces déclarées directement avec un espace de noms peuvent être déclarée publique ou interne et comme les classes et les structures, les interfaces défaut à l'accès interne.Les membres de l'énumération sont toujours publics, et aucun modificateur d'accès ne peut être appliqué.
Par défaut, les délégués ont interne accès.
Je voudrais ajouter un lien de documentation. Découvrez plus de détails ici .
Internal est le modificateur par défaut
La classe est interne par défaut.
L'interface est interne par défaut.
Les membres de l'interface sont public par défaut. (Les interfaces ne permettent pas aux utilisateurs de spécifier n'importe quel type d'accessibilité à ses membres.)
Remarque:Si vous essayez de spécifier un spécificateur d'accès aux membres de l'interface, cela indique une erreur de compilation.
Struct est Internal par défaut.
La réponse la plus simple est la suivante .....
Tous les membres de C # prennent toujours le modificateur LEAST accessible par défaut.
C'est pourquoi toutes les classes de niveau supérieur dans une assemblée sont par défaut "internes", ce qui signifie qu'elles sont publiques pour l'assemblée dans laquelle elles se trouvent, mais privées ou exclues de l'accès aux assemblées extérieures. La seule autre option pour une classe de niveau supérieur est publique, qui est plus accessible. Pour les types imbriqués, tout est privé, à quelques rares exceptions près, comme les membres d'énums et d'interfaces qui ne peuvent être que publics. Quelques exemples. Dans le cas des classes et des interfaces de niveau supérieur, les valeurs par défaut sont les suivantes:
classe Animal identique à classe interne Animal
interface Animal identique à interface publique Animal
Dans le cas de classes et d'interfaces imbriquées (types internes), les valeurs par défaut sont les suivantes:
classe Animal identique à classe privée Animal
interface Animal identique à interface privée Animal
Si vous supposez simplement que la valeur par défaut est toujours la plus privée, vous n’avez pas besoin d’utiliser un accesseur tant que vous n’avez pas besoin de modifier la valeur par défaut. Facile.
Niveau d'espace de noms: internal
Niveau de type: private