web-dev-qa-db-de.com

Was bedeutet der geplante "privat geschützte" C # -Zugriffsmodifikator?

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?

131
Kobi

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.

96
Gogutz

Hier sind alle Zugriffsmodifikatoren in Venn-Diagrammen, von einschränkender bis promiskuitiver:

private:
enter image description here

private protected: - hinzugefügt in 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

180
Kobi

Dies ist nur ein Diagramm (erstellt mit http://ashitani.jp/gv/ ) der verschiedenen Barrierefreiheitsstufen (Bilder passen nicht in Kommentare).

digraph diagram of C# access levels

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).

26

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.

9
Petr Abdulin

"Darf" nur für Unterklassen sichtbar sein, die sich in derselben Assembly befinden. Dies macht es ein wenig eingeschränkter als protected.

5
Mehmet Ataş

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“.

1
Julien Couvreur