Was ist der Unterschied zwischen "geschützt" und "geschützt intern"?


244

Kann mir bitte jemand den Unterschied zwischen "geschützten" und "geschützten internen" Modifikatoren in C # erläutern? Es sieht so aus, als würden sie sich genauso verhalten.

Antworten:


402

Der "geschützte interne" Zugriffsmodifikator ist eine Vereinigung der "geschützten" und "internen" Modifikatoren.

In MSDN, Zugriffsmodifikatoren (C # -Programmierhandbuch) :

geschützt :

Auf den Typ oder das Mitglied kann nur über Code in derselben Klasse oder Struktur oder in einer Klasse zugegriffen werden, die von dieser Klasse abgeleitet ist.

intern :

Auf den Typ oder das Mitglied kann von jedem Code in derselben Assembly zugegriffen werden, jedoch nicht von einer anderen Assembly.

geschützt intern :

Auf den Typ oder das Mitglied kann von jedem Code in der Assembly zugegriffen werden, in der es deklariert ist, ODER von einer abgeleiteten Klasse in einer anderen Assembly. Der Zugriff von einer anderen Assembly muss innerhalb einer Klassendeklaration erfolgen, die von der Klasse abgeleitet ist, in der das geschützte interne Element deklariert ist, und muss über eine Instanz des abgeleiteten Klassentyps erfolgen.

Beachten Sie Folgendes : protected internalbedeutet " protectedODER internal" (jede Klasse in derselben Assembly oder jede abgeleitete Klasse - auch wenn sie sich in einer anderen Assembly befindet).

... und der Vollständigkeit halber:

privat :

Auf den Typ oder das Mitglied kann nur über Code in derselben Klasse oder Struktur zugegriffen werden.

Öffentlichkeit :

Auf den Typ oder das Mitglied kann von jedem anderen Code in derselben Assembly oder einer anderen Assembly zugegriffen werden, die darauf verweist.

privat geschützt :

Der Zugriff ist auf die enthaltende Klasse oder Typen beschränkt, die von der enthaltenden Klasse in der aktuellen Assembly abgeleitet sind.
( Verfügbar seit C # 7.2 )


2
Kann ich ein Mitglied protected internalhaben, das sich protectedin der aktuellen Assembly befindet und extern nicht verfügbar ist?
Shimmy Weitzhandler

8
Das wäre "geschützt", nicht wahr?
CAD Kerl

2
@Shimmy: Sie können eine interne Klasse mit geschützten Methoden haben . Dann ist die gesamte Klasse für externe Assemblys nicht verfügbar.
M4N

1
@ Shimmy werfen Sie einen Blick auf diesen Vorschlag für eine zukünftige Version von C # github.com/dotnet/roslyn/blob/features/privateProtected/docs/…
Nate Cook

@Shimmy Zumindest CLR unterstützt das Konzept der Schnittstelle zwischen geschützter und interner Barrierefreiheit, C # -Sprache jedoch nicht. C # unterstützt nur die Vereinigung der beiden Zugriffsmodifikatoren.
RBT

89

protected kann von beliebigen Unterklassen aus jeder Baugruppe verwendet werden.

protected internalist alles, was protectedist, und auch alles in derselben Baugruppe kann darauf zugreifen.

Wichtig ist, dass es nicht "Unterklassen in derselben Baugruppe" bedeutet - es ist die Vereinigung der beiden, nicht der Schnittpunkt.


3
Nur eine Information für die Leser, dass CLR das Konzept der Schnittstelle von geschützter und interner Zugänglichkeit ebenfalls unterstützt, aber C # unterstützt dies nicht. C # unterstützt nur die Vereinigung der beiden, wie in diesem Beitrag erwähnt.
RBT

1
Nur eine weitere Information für Leser: "Unterklassen in derselben Assembly" können mit dem private protectedZugriffsmodifikator erreicht werden, der in C # 7.2
LordWilmore am

52

- Antwort 2019 aktualisieren -

Sie können den Unterschied in der folgenden tabellenbasierten Zugänglichkeit feststellen: Ja,

Geben Sie hier die Bildbeschreibung ein


4
Schöne Antwort, es kommuniziert sehr deutlich die Unterschiede zwischen den einzelnen Zugriffsmodifikatoren.
e_i_pi

23

In der Praxis über Methoden:

geschützt - zugänglich für geerbte Klassen, sonst privat.

intern - öffentlich nur für Klassen innerhalb der Versammlung, sonst privat.

protected internal - bedeutet, dass geschützte oder interne Methoden für geerbte Klassen und für alle Klassen innerhalb der Assembly zugänglich sind .


1
Ich würde OR verwenden, um auszudrücken, dass entweder nicht beides wahr sein muss.
Brian Rasmussen

Ich stimme dem Teil "zum Ändern des Verhaltens von Basisklassen" in der Beschreibung von "geschützt" nicht vollständig zu. Ich würde sagen, hier verwenden Sie "virtuell" (für die Basisklasse) und "überschreiben" (für die abgeleitete Klasse).
M4N

Gibt es eine Möglichkeit, ein Mitglied als protectedUND zu markieren internal?
Shimmy Weitzhandler

@ Shimmy: ja , protected internal.
Abatishchev

1
@ Shimmy zwei Jahre später und ja. Jetzt gibt es einen Weg in C # 7.2. Es heißt private protected docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Pauli Østerø

10

Es gibt immer noch viel Verwirrung beim Verständnis des Umfangs von "geschützten internen" Accessoren, obwohl die Definition der meisten korrekt definiert ist. Dies hat mir geholfen, die Verwechslung zwischen "geschützt" und "geschützt intern" zu verstehen:

Öffentlichkeit ist wirklich öffentlich innerhalb und außerhalb der Versammlung ( öffentlich intern / öffentlich extern )

protected ist innerhalb und außerhalb der Baugruppe wirklich geschützt ( intern geschützt / extern geschützt ) (in Klassen der obersten Ebene nicht zulässig).

privat ist innerhalb und außerhalb der Versammlung wirklich privat ( privat intern / privat extern ) (in Klassen der obersten Ebene nicht zulässig)

intern ist innerhalb der Versammlung wirklich öffentlich, aber außerhalb der Versammlung wie privat ausgeschlossen ( öffentlich intern / ausgeschlossen extern )

protected internal ist innerhalb der Assembly wirklich öffentlich, aber außerhalb der Assembly geschützt ( public internal / protected external ) (in Klassen der obersten Ebene nicht zulässig).

Wie Sie sehen können, ist geschütztes Inneres ein sehr seltsames Tier. Nicht intuitiv.

Das wirft nun die Frage auf, warum Microsoft keine ( geschützte interne / ausgeschlossene externe ) erstellt hat, oder ich denke, eine Art "privat geschützt" oder "intern geschützt"? lol. Scheint unvollständig?

Zu der Verwirrung kommt hinzu, dass Sie öffentliche oder geschützte interne verschachtelte Mitglieder in geschützten, internen oder privaten Typen verschachteln können. Warum sollten Sie auf eine verschachtelte "geschützte interne" Klasse innerhalb einer internen Klasse zugreifen, die den Zugriff auf externe Assemblys ausschließt?

Microsoft sagt, dass solche verschachtelten Typen durch ihren übergeordneten Typbereich begrenzt sind, aber das sagt der Compiler nicht. Sie können geschützte Interna in internen Klassen kompilieren, die den Umfang nur auf die Assembly beschränken sollten.

Für mich fühlt sich das nach unvollständigem Design an. Sie sollten den Umfang aller Typen für ein System vereinfacht haben, das eindeutig die Vererbung, aber auch die Sicherheit und Hierarchie verschachtelter Typen berücksichtigt. Dies hätte das Teilen von Objekten äußerst intuitiv und detailliert gemacht, anstatt die Zugänglichkeit von Typen und Mitgliedern anhand eines unvollständigen Scoping-Systems zu ermitteln.


1
private protected wurde jetzt zu C # 7.2 hinzugefügt, das im Wesentlichen intern UND geschützt ist.
Pauli Østerø

7

protected : Die Variable oder Methode steht nur untergeordneten Klassen zur Verfügung (in jeder Assembly).

protected internal : Verfügbar für untergeordnete Klassen in jeder Assembly und für alle Klassen innerhalb derselben Assembly


3

Ich habe sehr klare Definitionen für diese Begriffe vorgelesen.

Geschützt: Der Zugriff ist auf die Klassendefinition und alle Klassen beschränkt, die von der Klasse erben. Auf den Typ oder das Mitglied kann nur über Code in derselben Klasse oder Struktur oder in einer Klasse zugegriffen werden, die von dieser Klasse abgeleitet ist.

Intern: Der Zugriff ist ausschließlich auf Klassen beschränkt, die in der aktuellen Projektassembly definiert sind. Auf den Typ oder das Mitglied kann nur über Code in derselben Klasse zugegriffen werden.

Protected-Internal: Der Zugriff ist auf aktuelle Assemblys oder Typen beschränkt, die von der enthaltenen Klasse abgeleitet sind.


1

Geschütztes Mitglied

Geschütztes Mitglied einer Klasse ist nur in der enthaltenen Klasse (in der es deklariert wurde) und in der abgeleiteten Klasse innerhalb der Assembly und auch außerhalb der Assembly verfügbar.

Bedeutet, dass eine Klasse, die sich außerhalb der Assembly befindet, das geschützte Mitglied der anderen Assembly verwenden kann, indem nur diese Klasse geerbt wird.

Wir können das geschützte Element außerhalb der Assembly verfügbar machen, indem wir diese Klasse geerbt und nur in der abgeleiteten Klasse verwenden.

Hinweis: Auf geschützte Mitglieder kann mit dem Objekt in der abgeleiteten Klasse nicht zugegriffen werden.

Internes Mitglied

Internes Mitglied einer Klasse ist verfügbar oder Zugriff innerhalb der Assembly, entweder beim Erstellen eines Objekts oder in einer abgeleiteten Klasse, oder Sie können sagen, dass auf alle Klassen in der Assembly zugegriffen werden kann.

Hinweis: Interne Elemente, auf die außerhalb der Assembly weder über die Objekterstellung noch in einer abgeleiteten Klasse zugegriffen werden kann.

Geschützt intern

Der Modifikator "Geschützter interner Zugriff" ist eine Kombination aus "Geschützt" oder "Intern".

Geschütztes internes Mitglied kann in der gesamten Assembly verfügbar sein, in der es entweder das Objekt erstellt oder diese Klasse geerbt hat. Und kann nur in einer abgeleiteten Klasse außerhalb der Assembly aufgerufen werden.

Hinweis: Das geschützte interne Element arbeitet innerhalb derselben Baugruppe als intern und außerhalb der Baugruppe als geschützt.


1

public - Auf die als public deklarierten Mitglieder (Funktionen und Variablen) kann von überall aus zugegriffen werden.

privat - Auf private Mitglieder kann nicht von außerhalb der Klasse zugegriffen werden. Dies ist der Standardzugriffsspezifizierer für ein Mitglied. Wenn Sie also keinen Zugriffsspezifizierer für ein Mitglied (Variable oder Funktion) angeben, wird dieser als privat betrachtet. Daher String PhoneNumber; entspricht der privaten Zeichenfolge PhoneNumber.

protected - Auf geschützte Mitglieder kann nur über die untergeordneten Klassen zugegriffen werden.

intern - Der Zugriff ist nur innerhalb derselben Assembly möglich.

protected internal - Auf diese kann sowohl innerhalb derselben Assembly als auch in abgeleiteten Klassen zugegriffen werden.


0

Geschützte interne Best Suites, wenn ein Mitglied oder Typ in einer abgeleiteten Klasse einer anderen Assembly gleichzeitig verwendet werden soll, möchten nur das Mitglied oder den Typ in der übergeordneten Assembly verwenden, ohne von der Klasse abzuleiten, in der es deklariert ist. Auch wenn Sie nur ein Mitglied oder einen Typ verwenden möchten, ohne von einer anderen Klasse abgeleitet zu sein, können Sie in derselben Assembly nur interne verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.