Als Teil der Roslyn Dokumentation auf GitHub gibt es eine Seite namens Implementierungsstatus der Sprachfunktionen mit geplanten Sprachfunktionen für C # und VB.
Ein Feature, mit dem ich mich nicht zufrieden geben konnte, war private protected
Zugriffsmodifikator:
private protected string GetId() { … }
Es gibt auch eine Seite mit C # Language Design Notes , auf der viele neue Funktionen erklärt werden, diese jedoch nicht.
Eric Lippert sagte in einem Kommentar :
Ihr Fehler besteht darin, die Modifikatoren als zunehmende Einschränkungen zu betrachten. Die Modifikatoren verringern tatsächlich immer die Beschränkungen. Denken Sie daran, dass die Dinge standardmäßig "privat" sind. Nur wenn Sie Modifikatoren hinzufügen, werden diese weniger eingeschränkt.
Was ist die Bedeutung von private protected
? Wann könnte ich es benutzen?
Laut " Professional C # 2008 " von De Bill Evjen und Jay Glynn, Seite 1699:
privat geschützt - "nur abgeleitete Typen innerhalb der aktuellen Assembly"
C++/CLI hat eine ähnliche Funktion - Definieren und Konsumieren von Klassen und Strukturen (C++/CLI)> Sichtbarkeit von Mitgliedern :
private protected
-oder-protected private
- Das Mitglied ist innerhalb der Versammlung geschützt, aber außerhalb der Versammlung privat.
Hier sind alle Zugriffsmodifikatoren in Venn-Diagrammen, von einschränkender bis promiskuitiver:
private
:
private protected
: - hinzugefügt in C # 7.2
internal
:
protected
:
protected internal
:
public
:
Dies ist nur ein Diagramm (erstellt mit http://ashitani.jp/gv/ ) der verschiedenen Barrierefreiheitsstufen (Bilder passen nicht in Kommentare).
Jeder Pfeil bedeutet "ist restriktiver als".
Die CLR-Namen sind Private
, FamilyANDAssembly
, Assembly
, Family
, FamilyORAssembly
, Public
.
Viel späterer Edit: Es stellte sich heraus, dass diese neue Zugriffsebene (mit einem wirklich schlechten Namen) nicht in C # 6.0 enthalten war. Es wird nur von C # 7.2 unterstützt (und ich sehe, dass Sie Ihre Frage "Tags" aktualisiert haben).
Es ist nur eine Vermutung, aber von einem Namen aus könnte man vermuten, dass es eine eingeschränktere Version von protected
ist (oder eine entspanntere Version von private
, wenn Sie es wünschen). Und nur eine vernünftige Variante davon beschränkt das Verhalten von protected
auf Assembly.
Mögliche Verwendung: Dann möchten Sie protected
für die interne Implementierung haben, aber nicht für externe Zwecke (und Sie möchten die Klasse nicht versiegeln).
P.S. Es existierte immer in CLR, aber nicht in C # . Es ist eine Kombination aus protected
und internal
, Zitat:
CLR unterstützt auch die Zugriffsart "Familie und Assembly". Dies bedeutet, dass der Zugriff auf die Methode über den deklarierenden Typ, den verschachtelten und den abgeleiteten Typ erfolgt, jedoch nur, wenn sie in derselben Assembly deklariert sind. Offensichtlich war dies für das C # -Team keine sehr nützliche Funktion, sodass es in dieser Sprache nicht unterstützt wird.
"Darf" nur für Unterklassen sichtbar sein, die sich in derselben Assembly befinden. Dies macht es ein wenig eingeschränkter als protected
.
Siehe spec für die "private protected" Funktion:
Die intuitive Bedeutung von privat geschützt ist „in dieser Assembly für Typen zugänglich, die von der enthaltenden Klasse abgeleitet sind“.