Dans le cadre de la documentation Roslyn sur GitHub, il y a une page intitulée État d'implémentation des fonctionnalités linguistiques , avec les fonctionnalités linguistiques prévues pour C # et VB.
Une caractéristique que je ne pouvais pas comprendre était private protected
modificateur d'accès:
private protected string GetId() { … }
Il y a aussi une page de C # Language Design Notes , qui explique de nombreuses nouvelles fonctionnalités, mais pas celle-ci.
Eric Lippert a déclaré dans un commentaire :
Votre erreur est de considérer les modificateurs comme des restrictions croissantes. Les modificateurs diminuent en effet toujours les restrictions. N'oubliez pas que les choses sont "privées" par défaut; ce n'est qu'en ajoutant des modificateurs que vous les réduisez.
Quel est le sens de private protected
? Quand pourrais-je l'utiliser?
Selon " Professional C # 2008 " de De Bill Evjen et Jay Glynn, page 1699:
private protected - "uniquement les types dérivés dans l'assembly actuel"
C++/CLI a une fonctionnalité similaire - Définir et consommer des classes et des structures (C++/CLI)> Visibilité des membres :
private protected
-ou-protected private
- Le membre est protégé à l'intérieur de l'Assemblée mais privé à l'extérieur de l'Assemblée.
Voici tous les modificateurs d'accès dans les diagrammes de Venn, du plus limitant au plus promiscueux:
private
:
private protected
: - ajouté en C # 7.2
internal
:
protected
:
protected internal
:
public
:
Il s'agit simplement de fournir un graphique (réalisé avec http://ashitani.jp/gv/ ) des différents niveaux d'accessibilité (les images ne tiennent pas dans les commentaires).
Chaque flèche signifie "est plus restrictif que".
Les noms CLR sont Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
.
Beaucoup plus tard, il s'est avéré que ce nouveau niveau d'accès agréable (avec un nom vraiment médiocre) n'était pas finalement inclus dans C # 6.0. Il n'est pris en charge qu'à partir de C # 7.2 (et je vois que vous avez mis à jour vos "balises" de question).
C'est juste une supposition, mais à partir d'un nom, vous pouvez probablement deviner que c'est une version plus restreinte de protected
, (ou une version plus détendue de private
si vous le souhaitez). Et seule une variante raisonnable de celui-ci limite le comportement de protected
à Assembly.
Utilisation possible: alors vous voulez avoir protected
pour l'implémentation interne, mais pas pour les utilisations externes (et vous ne voulez pas sceller la classe).
P.S. Il a toujours existé en CLR, mais pas en C # . C'est une combinaison de protected
et internal
, citation:
CLR prend également en charge le type d'accès "Famille et assemblage". Cela signifie que la méthode est accessible à partir du type déclarant, des types imbriqués et dérivés, mais uniquement s'ils sont déclarés dans le même assembly. Eh bien, apparemment, l'équipe C # ne considérait pas cela comme une fonctionnalité très utile, donc elle n'est pas prise en charge dans ce langage.
"Peut être" visible uniquement aux sous-classes qui sont dans le même assembly. Cela le rend un peu restreint que protected
.
Voir spec pour la fonction "private protected":
La signification intuitive de private protected est "accessible dans cet assembly par des types dérivés de la classe contenante".