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 ou struct peut accéder à ce membre.
  • protégé : seul le code du même class ou dans un class 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.

Lorsqu’une déclaration d’une classe partielle ou d’une méthode partielle ne déclare pas son accessibilité, elle a l’accessibilité de l’autre déclaration. 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 être déclarés comme public ou internal. 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 internalou 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 publicM 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 publicet aucun modificateur d’accès ne peut être appliqué.

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.

Voir aussi