Modificateurs d’accès (Guide de programmation C#)
Tous les types et les membres de type ont un niveau d’accessibilité. Le niveau d’accessibilité contrôle s’il peut être utilisé à partir d’un autre code dans votre assembly ou d’autres assemblies. Un assembly est un fichier .dll ou .exe créé en compilant un ou plusieurs fichiers .cs dans une seule compilation. Utilisez les modificateurs d’accès suivants pour spécifier l’accessibilité d’un type ou d’un membre lorsque vous le déclarez :
- publique : le code dans n’importe quel assembly peut accéder à ce type ou à ce membre. Le niveau d’accessibilité du type conteneur contrôle le niveau d’accessibilité des membres publics du type.
- privé : seul le code déclaré dans le même
class
oustruct
peut accéder à ce membre. - protégé : seul le code du même
class
ou dans unclass
dérivé peut accéder à ce type ou à ce membre. - interne : seul le code du même assembly peut accéder à ce type ou à ce membre.
- interne protégé : seul le code du même assembly ou dans une classe dérivée d’un autre assembly peut accéder à ce type ou à ce membre.
- protégé privé : seul le code du même assembly et dans la même classe ou une classe dérivée peut accéder au type ou au membre.
- Fichier : seul le code du même fichier peut accéder au type ou au membre.
Le modificateur record
sur un type entraîne la synthèse des membres supplémentaires par le compilateur. Le modificateur record
n’affecte pas l’accessibilité par défaut pour un record class
ou un record struct
.
Tableau récapitulatif
Emplacement de l’appelant | public |
protected internal |
protected |
internal |
private protected |
private |
file |
---|---|---|---|---|---|---|---|
Dans le fichier | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ |
Dans la classe | ✔️️ | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ |
Classe dérivée (même assembly) | ✔️ | ✔️ | ✔️ | ✔️ | ✔️ | ❌ | ❌ |
Classe non dérivée (même assembly) | ✔️ | ✔️ | ❌ | ✔️ | ❌ | ❌ | ❌ |
Classe dérivée (assembly différent) | ✔️ | ✔️ | ✔️ | ❌ | ❌ | ❌ | ❌ |
Classe non dérivée (assembly différent) | ✔️ | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ |
Les exemples suivants montrent comment spécifier des modificateurs d’accès sur un type et un membre :
public class Bicycle
{
public void Pedal() { }
}
Les modificateurs d’accès ne sont pas toujours valides pour tous les types ou membres dans tous les contextes. Dans certains cas, l’accessibilité du type conteneur limite l’accessibilité de ses membres.
Plusieurs déclarations d’une classe partielle ou d’un membre partiel doivent avoir la même accessibilité. Si une déclaration de la classe partielle ou du membre n’inclut pas de modificateur d’accès, les autres déclarations ne peuvent pas déclarer de modificateur d’accès. Le compilateur génère une erreur si plusieurs déclarations pour la classe ou la méthode partielle déclarent des accessibilités différentes.
Accessibilité des classes et des structs
Les classes et les structs qui sont déclarés directement dans un espace de noms (qui ne sont pas imbriqués dans d’autres classes ou structs) peuvent avoir un accès public
, internal
ou file
. internal
est la valeur par défaut si aucun modificateur d’accès n’est spécifié.
Les membres de struct, y compris les classes et structs imbriqués, peuvent être déclarés public
, internal
ou private
. Les membres de classe, y compris les classes et structs imbriqués, peuvent être public
, protected internal
, protected
, internal
, private protected
ou private
. Les membres de classe et de struct, y compris les classes et les structs imbriqués, ont un accès private
par défaut.
Les classes dérivées ne peuvent pas avoir une accessibilité supérieure à celle de leurs types de base. Vous ne pouvez pas déclarer publique une classe B
qui dérive d’une classe interne A
. Si cela était autorisé, cela aurait pour effet de rendre A
public, car tous les membres protected
ou internal
de A
seraient accessibles à partir de la classe dérivée.
Vous pouvez autoriser d’autres assemblies spécifiques à accéder à vos types internes à l’aide d’InternalsVisibleToAttribute
. Pour plus d’informations, consultez Assemblys friend.
Autres types
Les interfaces qui sont déclarées directement dans un espace de noms peuvent être public
ou internal
et, tout comme les classes et les structs, les interfaces ont un niveau d’accès internal
par défaut. Les membres d’interface sont déclarés comme public
par défaut, car l’objectif d’une interface est de permettre à d’autres types d’accéder à une classe ou à un struct. Les déclarations de membre d’interface peuvent inclure n’importe quel modificateur d’accès. Vous utilisez des modificateurs d’accès sur interface
membres pour fournir une implémentation commune nécessaire par tous les implémenteurs d’une interface.
Un type delegate
déclaré directement dans un espace de noms dispose de l’accès internal
par défaut.
Pour plus d’informations sur les modificateurs d’accès, consultez la page niveaux d’accessibilité.
Accessibilité des membres
Vous pouvez déclarer les membres d’un class
ou struct
(notamment les classes et structs imbriqués) avec l’un des six types d’accès. Les membres de struct ne peuvent pas être déclarés protected
, protected internal
ou private protected
parce que les structs ne prennent pas en charge l’héritage.
Normalement, l’accessibilité d’un membre ne peut être supérieure à l’accessibilité du type qui le contient. Toutefois, un membre public
d’une classe internal
peut être accessible de l’extérieur de l’assembly si le membre implémente des méthodes d’interface ou substitue des méthodes virtuelles qui sont définies dans une classe de base public.
Le type d’un champ, d’une propriété ou d’un événement de membre doit être au moins aussi accessible que le membre lui-même. De même, le type de retour et les types de paramètre d’une méthode, d’un indexeur ou d’un délégué doivent être au moins aussi accessibles que le membre lui-même. Par exemple, vous ne pouvez pas avoir de méthode public
M
qui retourne une classe C
à moins que C
ne soit également public
. Vous ne pouvez pas non plus avoir une propriété protected
de type A
si A
est déclaré private
.
Les opérateurs définis par l’utilisateur doivent toujours être déclarés public
et static
. Pour plus d’informations, consultez Surcharge d’opérateur.
Pour définir le niveau d’accès pour un membre class
ou struct
, ajoutez le mot clé approprié à la déclaration de membre, comme indiqué dans l’exemple suivant.
// public class:
public class Tricycle
{
// protected method:
protected void Pedal() { }
// private field:
private int _wheels = 3;
// protected internal property:
protected internal int Wheels
{
get { return _wheels; }
}
}
Les finaliseurs ne peuvent pas avoir de modificateurs d’accessibilité. Les membres d’un type enum
sont toujours public
et aucun modificateur d’accès ne peut être appliqué.
Le modificateur d’accès file
est autorisé uniquement sur les déclarations de type de niveau supérieur (non imbriquées).
spécification du langage C#
Pour plus d'informations, voir la spécification du langage C#. La spécification du langage est la source de référence pour la syntaxe C# et son utilisation.