Was ist die Bedeutung des geplanten "private protected" C# zugriffsmodifizierer?
Als Teil der Roslyn Dokumentation auf GitHub, es gibt eine Seite namens Sprache, Funktion, Stand der Umsetzung, mit den geplanten Sprachfeatures für C# und VB.
Einem Funktion konnte ich nicht wickeln Sie meinen Kopf herum war private protected
Zugriff Modifikator:
private protected string GetId() { … }
Es gibt auch eine Seite von C# - Sprache-Design-Noten, die erklärt, viele neue features, aber nicht diese.
Eric Lippert sagte in einem Kommentar:
Dein Fehler ist zu denken, dass die Modifikatoren wie die zunehmenden Einschränkungen. Die Modifikatoren in der Tat immer Beschränkungen abzubauen. Denken Sie daran, die Dinge "privat" standardmäßig aktiviert; nur durch hinzufügen von Modifikatoren machen Sie Sie weniger eingeschränkt.
Was ist der Sinn des private protected
? Wann kann ich es nutzen?
- Beachten Sie, dass Informationen über Sie unter dem VB-Sprache-design-notes.
- Es ist eine Zuordnung zu MethodAttributes.FamANDAssem. C# hat eine merkwürdige Abbildung von internen, verwendet es (Privat|FamANDAssem). Und internen, geschützten Karten auf (Privat|Familie). Die CLR-Attribute sind seltsam.
- Diese vorgeschlagene Funktion wird mein Kommentar falsch.
- Der C# - design-team veröffentlicht eine Umfrage mit den vorgeschlagenen alternative syntax für dieses feature. Einige von Ihnen sind interessant, wie
protected & internal
,assembly protected
oderproternal
(ich hoffe, dass einige dieser "Scherze"). Es gibt auch die Diskussions-thread mit ein paar nette Einblicke. - Funktion ist nun markiert zurückgezogen in der Sprache, die Funktion Stand der Umsetzung! Ich persönlich mag die Idee, die dieser Zugriffsstufe und ich denke, es ist ein nützliches feature. Ich will das geschützt zu halten meinen code entsprechend der Klasse design, aber ich will nicht, dass andere schreiben hacky sublasses, die Zugriff auf diese Mitglieder. IMO die beste Lösung wäre es, wenn wir schreiben könnten
protected | internal
undprotected & internal
Du musst angemeldet sein, um einen Kommentar abzugeben.
Laut "Professional C# 2008" von De Bill Evjen Jay Glynn, Seite 1699:
C++/CLI hat eine ähnliche Funktion - Definieren und Verbrauchen Klassen und Strukturen (C++/CLI) > die Sichtbarkeit:
internal
geben, ohne dass das Mitglied sich selbst ausgesetzt, um alles in der Versammlung?internal
.internal
Sicht (in Bezug auf, wo die Klasse definiert ist) wirklich orthogonal zupublic
/protected
/private
Sicht (in Bezug auf Vererbung), und dass, vielleicht,internal
sollte seine eigenen modifier getrennt vonpublic
/protected
/private
.package
Sichtbarkeit in Java?package
in Java ist mehr wie ein namespace in C#.Hier sind alle zugriffsmodifizierer in Venn-Diagrammen, die aus mehr einschränken, um mehr promiscuous:
private
:private protected
: - Hinzugefügt in C# 7.2internal
:protected
:protected internal
:public
:Dies ist nur um eine Grafik (aus http://ashitani.jp/gv/) der verschiedenen accessibility-Ebenen (Bilder passen nicht in den Kommentaren).
Jeder Pfeil bedeutet "ist restriktiver als".
CLR Namen sind
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Viel später edit: Es stellte sich heraus, das tolle neue Zugriffsebene (mit einem wirklich schlechten Namen) war nicht schließlich enthalten in C# 6.0. Unterstützt wird es nur von C# 7.2 (und ich sehe Sie aktualisiert Ihre Frage "tags").
a → b
im Diagramm bedeutet "a
ist restriktiver alsb
", so kann man "Lesen" der Pfeil "ist restriktiver als" (das war, was ich versucht habe zu erklären), so, dass der Pfeil in die am wenigsten restriktive "Richtung". Das Gegenteil Konvention für die Pfeile hätte genauso gut, durch die Art und Weise, aber ich hatte zu wählen, die eine Konvention.Es ist nur eine Vermutung, aber vom Namen könnte man eventuell erraten, es ist eine eingeschränkte version von
protected
(oder mehr entspannte version vonprivate
wenn Sie möchten). Und die einzige vernünftige Variante ist die Beschränkungprotected
Verhalten bis zur Montage.Möglich Verwendung: möchtest du dann haben
protected
für die interne Umsetzung, nicht aber für externe Zwecke (und Sie nicht möchten, dass die Abdichtung der Klasse).P. S. Es gab es immer in CLR, aber nicht in C#. Es ist eine Kombination von
protected
undinternal
, Zitat:private
"..."Kann sein", sichtbar nur für Subklassen, die sich in derselben assembly. Dies macht es ein wenig eingeschränkt als
protected
.Sehen die spec für die "private protected" - Funktion: