Dans le cadre de la documentation Roslyn sur GitHub, il existe une page intitulée Statut de l'implémentation de la fonctionnalité de langage , avec des fonctionnalités de langage prévues pour C # et VB.
Une fonctionnalité sur laquelle je ne pouvais pas comprendre était le private protected
modificateur d'accès:
private protected string GetId() { … }
Il existe également une page de notes de conception du langage C # , 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 fait toujours les restrictions. Souvenez-vous que les choses sont "privées" par défaut; ce n'est qu'en ajoutant des modificateurs que vous les rendez moins restreints.
Quelle est la signification de private protected
? Quand pourrais-je l'utiliser?
protected & internal
,assembly protected
ouproternal
(j'espère que certains d' entre eux sont des blagues). Il y a aussi le fil de discussion avec quelques informations intéressantes.protected | internal
etprotected & internal
Réponses:
D'après " Professional C # 2008 " de De Bill Evjen et Jay Glynn, page 1699:
C ++ / CLI a une fonctionnalité similaire - Définir et consommer des classes et des structures (C ++ / CLI)> Visibilité des membres :
la source
internal
type sans exiger que le membre soit lui-même exposé à tout dans l'assembly?internal
.internal
visibilité (liée à l'endroit où la classe est définie) est vraiment orthogonale àpublic
/protected
/private
visibilité (liée à l'héritage) et que, peut-être,internal
devrait être son propre modificateur distinct depublic
/protected
/private
.package
en Java, cela ressemble plus à un espace de noms en C #.Voici tous les modificateurs d'accès dans les diagrammes de Venn, du plus limitatif au plus promiscuité:
private
:private protected
: - ajouté en C # 7.2internal
:protected
:protected internal
:public
:la source
Il s'agit simplement de fournir un graphique (réalisé avec http://ashitani.jp/gv/ ) des différents niveaux d'accessibilité (les images ne rentrent pas dans les commentaires).
Chaque flèche signifie "est plus restrictif que".
Les noms CLR sont
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Edition beaucoup plus tardive: il s'est avéré que ce nouveau niveau d'accès sympa (avec un nom vraiment médiocre) n'a finalement pas été inclus dans C # 6.0. Il est pris en charge uniquement à partir de C # 7.2 (et je vois que vous avez mis à jour votre question "tags").
la source
a → b
dans le diagramme signifie "a
est plus restrictif queb
", donc vous pouvez "lire" la flèche comme "est plus restrictive que" (c'est ce que j'ai essayé d'expliquer), donc la flèche pointe dans le moins restrictif " direction". La convention inverse pour les flèches aurait pu être tout aussi bonne, au fait, mais j'ai dû choisir une convention.C'est juste une supposition, mais à partir d'un nom que vous pourriez probablement deviner, c'est une version plus restreinte de
protected
, (ou une version plus détendue deprivate
si vous le souhaitez). Et la seule variante raisonnable de celui-ci est de restreindre leprotected
comportement à l'assemblage.Utilisation possible: alors vous voulez avoir
protected
pour l'implémentation interne, mais pas pour des utilisations externes (et vous ne voulez pas sceller la classe).PS Il a toujours existé en CLR, mais pas en C # . C'est une combinaison de
protected
etinternal
, citation:la source
"Peut être" uniquement visible pour les sous-classes qui sont dans le même assemblage. Cela le rend un peu restreint
protected
.la source
Voir la spécification de la fonctionnalité "protection privée":
la source