Als Teil der Roslyn- Dokumentation auf GitHub gibt es eine Seite mit dem Namen Implementierungsstatus für Sprachfunktionen mit geplanten Sprachfunktionen für C # und VB.
Eine Funktion, um die ich mich nicht kümmern konnte, war der private protected
Zugriffsmodifikator:
private protected string GetId() { … }
Es gibt auch eine Seite mit C # Language Design Notes , auf der viele neue Funktionen erläutert werden, jedoch nicht diese.
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 Einschränkungen. Denken Sie daran, dass die Dinge standardmäßig "privat" sind. Nur durch Hinzufügen von Modifikatoren werden diese weniger eingeschränkt.
Was bedeutet das private protected
? Wann könnte ich es benutzen?
quelle
protected & internal
,assembly protected
oderproternal
(ich hoffe , einige dieser Witze sind). Es gibt auch den Diskussionsthread mit einigen schönen Einsichten.protected | internal
undprotected & internal
Antworten:
Laut " Professional C # 2008 " von De Bill Evjen und Jay Glynn, Seite 1699:
C ++ / CLI verfügt über eine ähnliche Funktion: Definieren und Verwenden von Klassen und Strukturen (C ++ / CLI)> Sichtbarkeit von Mitgliedern :
quelle
internal
Typ akzeptiert oder zurückgibt, ohne dass das Mitglied selbst für alles in der Assembly verfügbar sein muss?internal
.internal
Sichtbarkeit (in Bezug auf den Ort, an dem die Klasse definiert ist) wirklich orthogonal zupublic
/protected
/private
Sichtbarkeit (in Bezug auf Vererbung) ist und dass dies möglicherweiseinternal
ein eigener Modifikator sein sollte, der vonpublic
/protected
/ getrennt istprivate
.package
ähnelt Java eher dem Namespace in C #.Hier sind alle Zugriffsmodifikatoren in Venn-Diagrammen, von einschränkender bis promiskuitiver:
private
::private protected
: - hinzugefügt in C # 7.2internal
::protected
::protected internal
::public
::quelle
Dies dient lediglich dazu, ein Diagramm (erstellt mit http://ashitani.jp/gv/ ) der verschiedenen Eingabehilfen bereitzustellen (Bilder passen nicht in Kommentare).
Jeder Pfeil bedeutet "ist restriktiver als".
Die CLR - Namen sind
Private
,FamilyANDAssembly
,Assembly
,Family
,FamilyORAssembly
,Public
.Viel später bearbeitet: Es stellte sich heraus, dass diese nette neue Zugriffsebene (mit einem wirklich schlechten Namen) schließlich 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).
quelle
a → b
im Diagramm bedeutet "a
ist restriktiver alsb
", also können Sie den Pfeil "lesen" als "ist restriktiver als" (das habe ich zu erklären versucht), also zeigt der Pfeil am wenigsten restriktiv ". Richtung". Die entgegengesetzte Konvention für die Pfeile hätte übrigens genauso gut sein können, aber ich musste eine Konvention wählen.Es ist nur eine Vermutung, aber von einem Namen 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 beschränkt dasprotected
Verhalten auf die Montage.Mögliche Verwendung: Dann möchten Sie
protected
für die interne Implementierung, aber nicht für externe Zwecke (und Sie möchten die Klasse nicht versiegeln).PS Es gab es immer in CLR, aber nicht in C # . Es ist eine Kombination aus
protected
undinternal
, Zitat:quelle
"Kann sein" ist nur für Unterklassen sichtbar, die sich in derselben Assembly befinden. Dies macht es ein wenig eingeschränkt als
protected
.quelle
Siehe die Spezifikation für die "privat geschützte" Funktion:
quelle