136 votes

Quelle est la signification du modificateur d'accès prévu "private protected" en C# ?

Dans le cadre de la Roslyn sur GitHub, il y a une page appelée État d'avancement de la mise en œuvre des fonctionnalités linguistiques avec des fonctionnalités linguistiques prévues pour C# et VB.

L'une des caractéristiques que je n'arrivais pas à comprendre était la suivante private protected modificateur d'accès :

private protected string GetId() { … } 

Il existe également une page de Notes sur la 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. En réalité, les modificateurs diminuent toujours les restrictions. Rappelez-vous que les choses sont "privées" par défaut ; ce n'est qu'en ajoutant des modificateurs que vous les rendez moins restrictives.

Quelle est la signification de private protected ? Quand puis-je l'utiliser ?

2 votes

Notez qu'il existe des informations à ce sujet dans la rubrique Notes sur la conception du langage VB .

3 votes

Il s'agit d'une correspondance avec MethodAttributes.FamANDAssem. C# a un mappage étrange de interne il utilise (Private|FamANDAssem). Et protégé à l'intérieur correspond à (Privé|Famille). Les attributs du CLR sont bizarres.

22 votes

La fonction proposée rendra mon commentaire incorrect.

195voto

Kobi Points 65357

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

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

3 votes

Image source : Modificateurs d'accès.pdn . J'ai utilisé le bien nommé Paint.Net .

9 votes

Où sont passés ces diagrammes pendant toute ma vie (C#) ? Ils sont excellents - merci !

98voto

Gogutz Points 1160

Selon " C# professionnel 2008 "par De Bill Evjen et Jay Glynn, page 1699 :

private protected - "uniquement les types dérivés dans l'assemblage actuel"

C++/CLI dispose d'une fonction 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.

75 votes

Il s'agit donc d'une "protection y interne" au lieu de "protégé ou interne" ?

2 votes

Il sera désormais possible de faire en sorte qu'un membre accessible aux classes dérivées accepte ou renvoie des éléments de type internal sans exiger que le membre soit lui-même exposé à tout ce qui se trouve dans l'assemblage ?

0 votes

Merci de votre attention ! Je n'y avais pas pensé. En fait, j'ai des cas où j'aurais utilisé ce modificateur, et je me suis rabattu sur internal .

28voto

Jeppe Stig Nielsen Points 17887

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 des CLR sont Private , FamilyANDAssembly , Assembly , Family , FamilyORAssembly , Public .


Modification bien plus tard : il s'est avéré que ce nouveau niveau d'accès (avec un nom très pauvre) était no a finalement été inclus dans C# 6.0. Il n'est supporté qu'à partir de C# 7.2 (et je vois que vous avez mis à jour votre question "tags").

0 votes

C'est peut-être moi, mais les flèches semblent aller dans le sens de "moins restrictif que".

4 votes

@acarlon Oui, donc a b dans le diagramme signifie " a est plus restrictif que le b "On peut donc "lire" la flèche comme "est plus restrictif que" (c'est ce que j'ai essayé d'expliquer), de sorte que la flèche pointe dans la "direction" la moins restrictive. La convention inverse pour les flèches aurait pu être tout aussi bonne, d'ailleurs, mais j'ai dû choisir une convention.

10voto

Petr Abdulin Points 7297

Ce n'est qu'une supposition, mais d'après le nom, on peut supposer qu'il s'agit d'une version plus restreinte de protected (ou une version plus souple de private si vous le souhaitez). La seule variante raisonnable consiste à restreindre protected 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).

P.S. Il a toujours existé dans CLR, mais pas en C# . Il s'agit d'une combinaison de protected y internal , citer :

Le CLR prend également en charge le type d'accès "Famille et assemblée". Cela signifie que la méthode est accessible à partir du type déclarant, des types imbriqués et dérivés, mais seulement s'ils sont déclarés dans le même assemblage. Apparemment, l'équipe C# n'a pas jugé cette fonctionnalité très utile et elle n'est donc pas prise en charge dans ce langage.

0 votes

+1 pour le commentaire sur le CLR - je passe tellement de temps en C# et si peu dans les autres langages .NET que j'oublie parfois qu'il ne s'agit pas de la même chose.

0 votes

@DarrelHoffman merci de l'avoir noté ! J'ai un peu mélangé mes pensées ici)

5voto

Mehmet Ataş Points 3560

"Peut être" uniquement visible par les sous-classes qui se trouvent dans le même assemblage. Cela le rend un peu plus restrictif que protected .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X