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.