Accessibilité

Références

L'actualité

Librairie

L'information

Introduction

Les modificateurs d'accès sont des mots clés utilisés pour spécifier l'accessibilité déclarée d'un membre ou d'un type. Cette section présente les quatre modificateurs d'accès :

  • public
  • protected
  • internal
  • private

Les modificateurs d'accès permettent de spécifier les six niveaux d'accessibilité suivants :

  • public : L'accès n'est pas limité.
  • protected : L'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur.
  • internal : L'accès est limité à l'assembly actuel.
  • protected internal : L'accès est limité à l'assembly actuel ou aux types dérivés de la classe conteneur.
  • private : L'accès est limité au type conteneur.
  • private protected : L'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur dans l'assembly actuel.

Cette section introduit également les éléments suivants :

  • Niveaux d'accessibilité : utilisation des quatre modificateurs d'accès pour déclarer six niveaux d'accessibilité.
  • Domaine d'accessibilité : spécifie où, dans les sections du programme, un membre peut être référencé.
  • Limitations sur l'utilisation des niveaux d'accessibilité : résumé des restrictions sur l'utilisation des niveaux d'accessibilité déclarés.

Niveaux d'accessibilité

Utilisez les modificateurs d'accès public, protected, internal ou private pour spécifier l'un des niveaux d'accessibilité déclarés ci-dessous pour les membres.

Accessibilité déclarée Signification
public L'accès n'est pas limité.
protected L'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur.
internal L'accès est limité à l'assembly actuel.
protected internal L'accès est limité à l'assembly actuel ou aux types dérivés de la classe conteneur.
private L'accès est limité au type conteneur.
private protected L'accès est limité à la classe conteneur ou aux types dérivés de la classe conteneur dans l'assembly actuel. Disponible depuis C# 7.2.

Vous ne pouvez spécifier qu'un seul modificateur d'accès pour un membre ou un type, sauf si vous utilisez les combinaisons protected internal ou private protected.

Les modificateurs d'accès ne sont pas autorisés sur les espaces de noms. Les espaces de noms ne présentent aucune limitation d'accès.

Selon le contexte dans lequel une déclaration de membre est effectuée, seules certaines accessibilités déclarées sont autorisées. Si aucun modificateur d'accès n'est spécifié dans une déclaration de membre, une accessibilité par défaut est utilisée.

Les types de premier niveau, qui ne sont pas imbriqués dans d'autres types, peuvent uniquement avoir une accessibilité internal ou public. L'accessibilité par défaut de ces types est internal.

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

Membres de Accessibilité par défaut du membre Accessibilité déclarée du membre autorisée
enum public Aucun.
class private public
protected
internal
private
protected internal
private protected
interface public Aucun.
struct private public
internal
private

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 conteneur immédiat. Toutefois, le domaine d'accessibilité d'un type imbriqué ne peut pas dépasser celui du type conteneur.

Domaine d'accessibilité

Le domaine d'accessibilité d'un membre indique dans quelles sections du programme un membre peut être référencé. Si le membre est imbriqué dans un autre type, son domaine d'accessibilité est déterminé à la fois par le niveau d'accessibilité du membre et par le domaine d'accessibilité du type conteneur immédiat.

Le domaine d'accessibilité d'un type de niveau supérieur est au moins le texte du programme du projet dans lequel il est déclaré. Cela signifie que le domaine inclut tous les fichiers sources de ce projet. Le domaine d'accessibilité d'un type imbriqué est au moins le texte de programme du type dans lequel il est déclaré. Autrement dit, le domaine est le corps du type, qui inclut tous les types imbriqués. Le domaine d'accessibilité d'un type imbriqué ne dépasse jamais celui du type conteneur. Ces concepts sont illustrés dans l'exemple suivant.

Exemple

Cet exemple comporte un type de niveau supérieur, T1, et deux classes imbriquées, M1 et M2. Les classes contiennent des champs qui ont des accessibilités déclarées différentes. Dans la méthode Main, un commentaire suit chaque instruction pour indiquer le domaine d'accessibilité de chaque membre. Notez que les instructions qui tentent de référencer les membres inaccessibles sont commentées. Si vous voulez examiner les erreurs du compilateur causées par une référence à un membre inaccessible, supprimez les commentaires un à un.

Limitations sur l'utilisation des niveaux d'accessibilité

Lorsque vous spécifiez un type dans une déclaration, vérifiez si le niveau d'accessibilité du type dépend du niveau d'accessibilité d'un membre ou d'un autre type. Par exemple, la classe de base directe doit être au moins aussi accessible que la classe dérivée. Les déclarations suivantes entraînent une erreur du compilateur, car la classe de base BaseClass est moins accessible que MyClass :

Le tableau suivant résume les limitations sur les niveaux d'accessibilité déclarés.

Contexte Notes
Classes La classe de base directe d'un type de classe doit être au moins aussi accessible que le type de classe lui-même.
Interfaces Les interfaces de base explicites d'un type d'interface doivent être au moins aussi accessibles que le type d'interface lui-même.
Délégués Le type de retour et les types de paramètres d'un type délégué doivent être au moins aussi accessibles que le type délégué lui-même.
Constantes Le type d'une constante doit être au moins aussi accessible que la constante elle-même.
Champs Le type d'un champ doit être au moins aussi accessible que le champ lui-même.
Méthodes Le type de retour et les types de paramètres d'une méthode doivent être au moins aussi accessibles que la méthode elle-même.
Propriétés Le type d'une propriété doit être au moins aussi accessible que la propriété elle-même.
événements Le type d'un événement doit être au moins aussi accessible que l'événement lui-même.
Indexeurs Le type et les types de paramètres d'un indexeur doivent être au moins aussi accessibles que l'indexeur lui-même.
Opérateurs Le type de retour et les types de paramètres d'un opérateur doivent être au moins aussi accessibles que l'opérateur lui-même.
Constructeurs Les types de paramètres d'un constructeur doivent être au moins aussi accessibles que le constructeur lui-même.

Exemple

L'exemple suivant contient des déclarations erronées de différents types. Le commentaire qui suit chaque déclaration indique l'erreur du compilateur à attendre.



public

Le mot clé public est un modificateur d'accès pour les types et les membres de types. L'accès public est le niveau d'accès le plus permissif. Il n'existe pas de restrictions d'accès aux membres publics, comme dans cet exemple :

Exemple

Dans l'exemple suivant, deux classes sont déclarées, PointTest et MainClass. L'accès aux membres publics x et y de PointTest s'effectue directement à partir de MainClass.

Si vous remplacez le niveau d'accès public par private ou protected, le message d'erreur suivant s'affiche : 'PointTest.y' est inaccessible en raison de son niveau de protection.


private

Le mot clé private est un modificateur d'accès de membre.

Cette page traite de l'accès private. Le mot clé private fait également partie du modificateur d'accès private protected.

L'accès privé est le niveau d'accès le moins permissif. Les membres privés sont accessibles uniquement dans le corps de la classe ou le struct dans lequel ils sont déclarés, comme dans cet exemple :

Les types imbriqués dans le même corps peuvent également accéder à ces membres privés.

Référencer un membre privé en dehors d'une classe ou d'un struct où il est déclaré serait à l'origine d'une erreur de compilation.

Pour obtenir une comparaison de private et des autres modificateurs d'accès, consultez Niveaux d'accessibilité et Modificateurs d'accès.

Exemple

Dans cet exemple, la classe Employee contient deux membres de données privés, name et salary. S'agissant de membres privés, ils sont accessibles uniquement par les méthodes membres. Les méthodes publiques GetName et Salary sont ajoutées pour permettre un accès contrôlé aux membres privés. Le membre name est accessible via une méthode publique et le membre salary est accessible via une propriété publique en lecture seule. (Pour plus d'informations, consultez Propriétés.)


internal

Le mot clé internal est un modificateur d'accès pour les types et les membres de type.

Cette page traite de l'accès internal. Le mot clé internal fait également partie du modificateur d'accès protected internal.

Les types et les membres internes (internal) sont accessibles uniquement dans les fichiers d'un même assembly, comme dans l'exemple suivant :

Pour obtenir une comparaison de internal et des autres modificateurs d'accès, consultez Niveaux d'accessibilité et Modificateurs d'accès.

Pour plus d'informations, consultez Assemblys et le Global Assembly Cache.

L'accès interne est fréquemment utilisé lors du développement basé sur les composants, car il permet à un groupe de composants de collaborer de façon privée sans être exposés au reste du code de l'application. Par exemple, un framework de création d'interfaces graphiques utilisateur peut fournir les classes Control et Form qui coopèrent en utilisant des membres ayant un accès interne. étant donné que ces membres sont internes, ils ne sont pas exposés au code qui utilise le framework.

Le fait de référencer un type ou un membre avec accès interne en dehors de l'assembly dans lequel il a été défini constitue une erreur.

Exemple

Cet exemple contient deux fichiers : Assembly1.cs et Assembly1_a.cs. Le premier fichier contient la classe de base interne BaseClass. Dans le deuxième fichier, une tentative d'instanciation de BaseClass génère une erreur.


Dans cet exemple, utilisez les mêmes fichiers que vous avez utilisés dans l'exemple 1, et remplacez le niveau d'accessibilité BaseClass par public. Remplacez également le niveau d'accessibilité du membre IntM par internal. Dans ce cas, vous pouvez instancier la classe, mais vous ne pouvez pas accéder au membre interne.



protected

Le mot clé protected est un modificateur d'accès de membre.

Cette page traite de l'accès protected. Le mot clé protected fait également partie des modificateurs d'accès protected internal et private protected.

Un membre protégé est accessible dans sa classe et par les instances de la classe dérivée.

Pour obtenir une comparaison de protected et des autres modificateurs d'accès, consultez Niveaux d'accessibilité.

Exemple

Un membre protégé d'une classe de base est accessible dans une classe dérivée uniquement si l'accès s'effectue par le biais du type de la classe dérivée. Prenons l'exemple de l'extrait de code suivant :

L'instruction a.x = 10 génère une erreur, car elle est appelée dans la méthode statique Main, et pas dans une instance de la classe B.

Les membres de struct ne peuvent pas être protégés, car le struct ne peut pas être hérité.

Dans cet exemple, la classe DerivedPoint est dérivée de Point. Vous pouvez donc accéder aux membres protégés de la classe de base directement à partir de la classe dérivée.

Si vous changez les niveaux d'accès de x et y à private, le compilateur affiche les messages d'erreur suivants :

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.


protected internal

La combinaison de mots clés protected internal est un modificateur d'accès de membre. Un membre interne protégé est accessible depuis l'assembly actif ou depuis des types dérivés de la classe conteneur. Pour obtenir une comparaison de protected internal et des autres modificateurs d'accès, consultez Niveaux d'accessibilité.

Exemple

Un membre interne protégé d'une classe de base est accessible depuis n'importe quel type au sein de son assembly conteneur. Il est également accessible dans une classe dérivée qui se trouve dans un autre assembly seulement si l'accès s'effectue via une variable du type de la classe dérivée. Prenons l'exemple de l'extrait de code suivant :


Cet exemple contient deux fichiers : Assembly1.cs et Assembly2.cs. Le premier fichier contient une classe de base publique, BaseClass, et une autre classe, TestAccess. BaseClass possède un membre interne protégé, myValue, à laquelle le type TestAccess accède. Dans le deuxième fichier, une tentative d'accès à myValue via une instance de BaseClass génère une erreur, tandis qu'un accès à ce membre via une instance d'une classe dérivée, DerivedClass, réussit.

Les membres de struct ne peuvent pas être protected internal, car le struct ne peut pas être hérité.


private protected

La combinaison de mots clés private protected est un modificateur d'accès de membre. Un membre protégé privé est accessible par les types dérivés de la classe conteneur, mais seulement au sein de son assembly conteneur. Pour obtenir une comparaison de private protected et des autres modificateurs d'accès, consultez Niveaux d'accessibilité.


Le modificateur d'accès private protected est valide dans C# 7.2 et ultérieur.

Exemple

Un membre protégé privé d'une classe de base est accessible à partir des types dérivés de son assembly conteneur seulement si le type statique de la variable est le type de la classe dérivée. Prenons l'exemple de l'extrait de code suivant :


Cet exemple contient deux fichiers : Assembly1.cs et Assembly2.cs. Le premier fichier contient une classe de base publique, BaseClass, et un type qui en est dérivé, DerivedClass1. BaseClass possède un membre protégé privé, myValue, auquel DerivedClass1 tente d'accéder de deux manières. La première tentative d'accès à myValue via une instance de BaseClass génère une erreur. Cependant, la tentative de l'utiliser comme un membre hérité dans DerivedClass1 réussit. Dans le deuxième fichier, une tentative d'accès à myValue en tant que membre hérité de DerivedClass2 génère une erreur, car il est accessible seulement par des types dérivés dans Assembly1.

Les membres de struct ne peuvent pas être private protected, car le struct ne peut pas être hérité.