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 :

  • public : n’importe quel autre code dans le même assembly ou un autre assembly qui le référence peut accéder à ce type ou à ce membre. Le niveau d’accessibilité des membres publics d’un type est contrôlé par le niveau d’accessibilité du type lui-même.
  • private (privé) : seul du code dans la même class ou dans le même struct peut accéder au type ou au membre.
  • protected (protégé) : seul du code dans la même class ou dans la class dérivée de cette class peut accéder au type ou au membre.
  • internal (interne) : tout code du même assembly peut accéder au type ou au membre, mais l’accès est impossible dans le cas d’un code issu d’un autre assembly. En d’autres termes, les types ou les membres internal sont accessibles par du code faisant partie de la même compilation.
  • protected internal (interne protégé) : tout code de l’assembly dans lequel le type ou le membre est déclaré ou d’une class dérivée dans un autre assembly peut accéder au type ou au membre.
  • private protected(protégé privé) : les types dérivant de la class et qui sont déclarés dans l’assembly conteneur peuvent accéder au type ou au membre.

Tableau récapitulatif

Emplacement de l’appelant public protected internal protected internal private protected private
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é d’un membre de type est limitée par l’accessibilité de son type conteneur.

Accessibilité des classes, des enregistrements et des structs

Les classes, les enregistrements et les structs qui sont déclarés directement dans un espace de noms (autrement dit, 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. L’accès aux types imbriqués private n’est pas possible hors du type conteneur.

Les classes dérivées et les enregistrements dérivés ne peuvent pas avoir une meilleure accessibilité que 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.

Accessibilité des membres de classe, d’enregistrement et de struct

Vous pouvez déclarer les membres de classe (notamment les classes, les enregistrements et les 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.

Les finaliseurs ne peuvent pas avoir de modificateurs d’accessibilité.

Pour définir le niveau d’accès pour un membre class, record 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; }
    }
}

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. Cela est particulièrement utile pour les méthodes statiques afin de fournir les implémentations courantes nécessaires à tous les implémenteurs d’une classe.

Les membres de l’énumération sont toujours considérés comme public, et aucun modificateur d’accès ne peut être appliqué.

Les délégués se comportent comme des classes et des structs. Par défaut, ils ont un accès internal lorsqu’ils sont déclarés directement dans un espace de noms et private lorsqu’ils sont imbriqués.

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