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.
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:
Der "geschützte interne" Zugriffsmodifikator ist eine Vereinigung der "geschützten" und "internen" Modifikatoren.
In MSDN, Zugriffsmodifikatoren (C # -Programmierhandbuch) :
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 internal
bedeutet " protected
ODER 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.
Auf den Typ oder das Mitglied kann von jedem anderen Code in derselben Assembly oder einer anderen Assembly zugegriffen werden, die darauf verweist.
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 )
protected
kann von beliebigen Unterklassen aus jeder Baugruppe verwendet werden.
protected internal
ist alles, was protected
ist, 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.
private protected
Zugriffsmodifikator erreicht werden, der in C # 7.2
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 .
protected
UND zu markieren internal
?
protected internal
.
private protected
docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
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.
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.
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.
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.
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.
protected internal
haben, das sichprotected
in der aktuellen Assembly befindet und extern nicht verfügbar ist?