Quelqu'un peut-il me expliquer la différence entre les modificateurs "protégés" et "internes protégés" en C #? Il semble qu'ils se comportent de la même manière.
Le modificateur d'accès "protected internal" est un nion des modificateurs "protected" et "internal".
De MSDN, Modificateurs d'accès (Guide de programmation C #) :
Le type ou le membre est accessible uniquement par le code de la même classe ou structure, ou d'une classe dérivée de cette classe.
Le type ou le membre peut être accédé par n'importe quel code de la même assemblée, mais pas par une autre assemblée.
protégé en interne :
Le type ou le membre peut être accédé par n'importe quel code de l'assembly dans lequel il est déclaré, OU à partir d'une classe dérivée dans un autre assembly. L'accès à partir d'un autre assembly doit avoir lieu dans une déclaration de classe dérivée de la classe dans laquelle l'élément interne protégé est déclaré, et il doit s'effectuer via une instance du type de classe dérivé.
Notez que : protected internal
signifie "protected
OR internal
" (toute classe dans même assemblée, ou n'importe quelle classe dérivée - même si elle se trouve dans une assemblée différente).
... et pour être complet:
Le type ou le membre n'est accessible que par code dans la même classe ou structure.
Le type ou le membre est accessible par tout autre code du même assemblage ou d'un autre assemblage qui le référence.
L'accès est limité à la classe contenant ou aux types dérivés de la classe dans l'assembly en cours.
(Disponible depuis C # 7.2)
protected
peut être utilisé par toutes les sous-classes de tout assemblage.
protected internal
est tout ce que protected
est, plus tout ce qui se trouve dans la même Assemblée peut y accéder.
Il est important de noter que cela ne signifie pas "sous-classes dans la même assemblée" - c'est l'union des deux, pas l'intersection.
En pratique, à propos des méthodes:
protected - accessible pour les classes héritées, sinon privé.
interne - public uniquement pour les classes de l'Assemblée, sinon privé.
protected internal - signifie protégé ou internal - les méthodes deviennent accessibles pour les classes héritées et pour toutes les classes de l'Assemblée.
Il y a toujours beaucoup de confusion dans la compréhension de la portée des accesseurs "internes protégés", bien que la plupart aient la définition définie correctement. Cela m'a aidé à comprendre la confusion entre "protégé" et "protégé interne":
public est réellement public à l'intérieur et à l'extérieur de l'Assemblée (public interne/public externe)
protégé est vraiment protégé à l'intérieur et à l'extérieur de l'Assemblée (protégé interne/protégé externe) (non autorisé dans les classes de niveau supérieur)
privé est vraiment privé à l'intérieur et à l'extérieur de l'Assemblée (privé interne/privé externe) (non autorisé dans les classes de niveau supérieur)
interne est réellement public à l'intérieur de l'Assemblée mais exclu en dehors de l'Assemblée comme privé (public interne/exclu externe)
protected internal est réellement public à l'intérieur de l'Assemblée mais protégé en dehors de l'Assemblée (public interne/protected external) (non autorisé dans les classes de niveau supérieur)
Comme vous pouvez le voir protected internal est une bête très étrange. Pas intuitif.
Cela pose maintenant la question de savoir pourquoi Microsoft n'a-t-il pas créé un (protégé interne/exclus externe) ou une sorte de "privé protégé" ou "interne protégé"? lol. Semble incomplet?
À la confusion, s'ajoute le fait que vous pouvez imbriquer des membres imbriqués internes publics ou protégés dans des types protégés, internes ou privés. Pourquoi voudriez-vous accéder à un "interne protégé" imbriqué dans une classe interne qui exclut l'accès en dehors de l'Assemblée?
Microsoft indique que ces types imbriqués sont limités par la portée de leur type parent, mais ce n'est pas ce que dit le compilateur. Vous pouvez compiler des internes protégés à l'intérieur de classes internes, ce qui devrait limiter la portée à uniquement l'assembly.
Pour moi, cela ressemble à un design incomplet. Ils doivent avoir une portée simplifiée de tous les types dans un système qui prend clairement en compte l'héritage, mais également la sécurité et la hiérarchie des types imbriqués. Cela aurait rendu le partage d'objets extrêmement intuitif et granulaire plutôt que de découvrir l'accessibilité des types et des membres basée sur un système de cadrage incomplet.
protected: la variable ou la méthode ne sera disponible que pour les classes enfants (dans n'importe quel assembly)
protected internal: disponible pour les classes enfants de n'importe quelle assemblée et pour toutes les classes d'une même assemblée
J'ai lu des définitions très claires pour ces termes.
Protected: l'accès est limité à la définition de classe et à toute classe qui hérite de la classe. Le type ou le membre est accessible uniquement par le code de la même classe ou structure ou d'une classe dérivée de cette classe.
Internal: l'accès est limité aux classes définies dans l'assembly du projet en cours. Le type ou le membre est accessible uniquement par code dans la même classe.
Protected-Internal: l'accès est limité à Assembly ou aux types dérivés de la classe conteneur.
membre protégé
Membre protégé d'une classe disponible uniquement dans la classe contenue (dans laquelle elle a été déclarée) et dans la classe dérivée dans l'Assemblée et également en dehors de l'Assemblée.
Indique si une classe résidant en dehors de l'Assemblée peut utiliser le membre protégé de l'autre Assemblée en héritant uniquement de cette classe.
Nous pouvons exposer le membre protégé en dehors de l'assembly en héritant de cette classe et l'utiliser uniquement dans la classe dérivée.
Remarque: Les membres protégés ne sont pas accessibles à l'aide de l'objet de la classe dérivée.
membre interne
Un membre interne d'une classe est disponible ou accessible dans l'Assemblée, que ce soit en créant un objet ou dans une classe dérivée, ou vous pouvez dire qu'il est accessible pour toutes les classes de l'Assemblée.
Remarque: Les membres internes ne sont pas accessibles en dehors de l'assembly à l'aide de la création d'objet ou d'une classe dérivée.
Protégé Interne
Le modificateur d'accès interne protégé est une combinaison protégée ou interne.
Le membre interne protégé peut être disponible dans l'ensemble de l'assembly dans lequel il a déclaré créer l'objet ou hérité de cette classe. Et peut être accessible en dehors de l'Assemblée dans une classe dérivée uniquement.
Remarque: Le membre interne protégé fonctionne comme interne dans la même assemblée et comme protégé pour l'extérieur de l'assemblage.
public - Les membres (Fonctions & Variables) déclarés comme publics sont accessibles de n’importe où.
privé - Les membres privés ne sont pas accessibles en dehors de la classe. Il s’agit du spécificateur d’accès par défaut pour un membre. En d’autres termes, si vous ne spécifiez aucun spécificateur d’accès pour un membre (variable ou fonction), il sera considéré comme privé. Par conséquent, string PhoneNumber; est équivalent à la chaîne privée PhoneNumber.
protected - Les membres protégés ne sont accessibles que depuis les classes enfants.
interne - On ne peut y accéder que dans le même assemblage.
protected internal - Il est accessible dans la même Assemblée et dans la classe dérivée.
Les meilleures suites internes protégées lorsque vous voulez qu'un membre ou un type soit utilisé dans une classe dérivée d'un autre assembly en même temps, veulent simplement consommer le membre ou taper dans l'assembly parent sans dériver de la classe où il est déclaré. De même, si vous souhaitez uniquement utiliser un membre ou un type sans dériver d'une autre classe, vous ne pouvez utiliser que dans interne.