web-dev-qa-db-fra.com

Quelle est la signification du modificateur d'accès C # "privé protégé" prévu?

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?

131
Kobi

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.

96
Gogutz

Voici tous les modificateurs d'accès dans les diagrammes de Venn, du plus limitant au plus promiscueux:

private:
enter image description here

private protected: - ajouté en C # 7.2
enter image description here

internal:
enter image description here

protected:
enter image description here

protected internal:
enter image description here

public:
enter image description here

180
Kobi

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).

digraph diagram of C# access levels

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).

26

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.

9
Petr Abdulin

"Peut être" visible uniquement aux sous-classes qui sont dans le même assembly. Cela le rend un peu restreint que protected.

5
Mehmet Ataş

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".

1
Julien Couvreur