C# 7.2 introduit le modificateur private protected .
J'ai toujours protégé l'accès aux champs par des propriétés, en autorisant l'accès par les méthodes Get/Set, car je ne veux généralement pas que l'état interne de mon objet soit modifié par autre chose que ma propre classe.
J'essaie de comprendre pourquoi l'équipe du langage C# a ajouté cette fonctionnalité. Après une recherche approfondie sur Google, ainsi que la lecture et le visionnage des médias " quoi de neuf " (j'ai regardé l'émission Communiqué de presse , détails et vidéo de Mads Torgerson ), je ne suis toujours pas le plus sage.
Pour moi, cela semble permettre à un développeur de briser le principe de substitution de Liskov, mais c'est peut-être parce que je ne comprends pas pourquoi cette fonctionnalité existe maintenant.
Je comprends comment il peut être utilisé, mais pas pourquoi - s'il vous plaît, quelqu'un peut-il fournir un exemple d'utilisation réelle plutôt que celui inventé dans les documents MSDN ?
4 votes
Êtes-vous sûr de comprendre ce que fait ce modificateur ?
0 votes
Probablement parce que le CLR le supporte, voir
MethodAttributes.FamANDAssem
. C# déjà supportéinternal protected
qui estMethodAttributes.FamORAssem
il est logique d'être exhaustif0 votes
De quelle manière pensez-vous que cela brise le PSL ?
1 votes
C'est très similaire à
protected
mais avec une différence importante : si une classe en est dérivée mais dans une autre assemblée, elle ne peut pas accéder à ce membre alors queprotected
n'est pas limité à la même assemblée.6 votes
Voici un exemple de l'endroit où je compte l'utiliser, si cela peut vous aider : github.com/GoogleCloudPlatform/google-cloud-dotnet/blob/master/
0 votes
@JonSkeet et pourquoi pas faire
Query
si vous ne voulez pas autoriser son instanciation directe (ce qui serait implicite avec l'optionprivate protected
) ?2 votes
@Evk : Parce que je faire voulez l'instancier directement à partir de Query. C'est bien que Query soit une classe concrète, et c'est bien d'avoir une sous-classe - mais seulement au sein de la même assemblée. Il n'est pas acceptable que d'autres codes créent des instances de
Query
.private protected
me donnerait exactement ce que je veux.0 votes
@JonSkeet Je n'ai pas dit que ça cassait le PSL, j'ai dit que je pensais que ça pouvait permettre à un développeur de casser le PSL. Je pensais que vous pouviez d'une manière ou d'une autre changer le comportement de la classe de base pour faire quelque chose d'indésirable en modifiant un champ (et la façon dont je travaille - les champs sont strictement des "états internes"). Comme je l'ai dit, c'est juste la façon dont cela me semble, car je n'ai pas encore bien compris pourquoi cela serait utilisé.
0 votes
@Jay : C'est vrai que j'ai mal interprété. Mais la possibilité de violer les PSL a toujours été disponible. Un développeur peut rendre un champ public. Pourquoi l'introduction d'un niveau d'accès supplémentaire (qui vous permet d'être un agent de sécurité) ne serait-elle pas une bonne chose ? plus privé que vous pouvez dans certaines situations) permet au développeur de briser le PSL plus qu'il ne le peut maintenant ? Cela leur permet de evitar en donnant plus de contrôle.
0 votes
@JonSkeet Oui, ce que vous dites est vrai, un dev peut rendre un champ public (bien que personnellement je ne le fasse jamais) - il n'y a peut-être aucune raison de s'inquiéter. La raison pour laquelle je pose cette question est que j'ai du mal à comprendre la nécessité de ce type de modificateur d'accès. Maintenant que j'ai une pause déjeuner, je peux lire tous les commentaires et réponses et voir si je peux comprendre pourquoi les gens utilisent ou prévoient d'utiliser cette nouvelle fonctionnalité. Peut-être Evk avait-il raison - peut-être ai-je mal compris ce que fait ce modificateur. D'après ce que je vois, j'ai beaucoup de choses à lire ! :) Merci à tous ceux qui ont pris le temps de commenter
2 votes
Ver blogs.msdn.microsoft.com/ericlippert/2008/04/24/ pour quelques réflexions à ce sujet. Il y a une raison pour laquelle il a fallu quinze ans pour que cette fonctionnalité soit suffisamment proche du sommet de la liste des priorités pour être mise en œuvre : il ne s'agit pas d'une fonctionnalité très convaincante, intéressante ou utile. .
0 votes
@EricLippert +1 pour votre blog J'ai aimé l'idée de
proternal or intected (The former sounds very positive; the latter, like bad news from a dentist.)
comme noms possibles depuis 2008 ! Cela m'a fait rire ce matin !