Was ist der Standardzugriffsmodifikator für Klassen, Methoden, Mitglieder, Konstruktoren, Delegierte und Schnittstellen?
Hinweis: In C# 8 sind Zugriffsmodifikatoren in Schnittstellen erlaubt und standardmäßig auf public eingestellt.
Was ist der Standardzugriffsmodifikator für Klassen, Methoden, Mitglieder, Konstruktoren, Delegierte und Schnittstellen?
Der Standardzugriff für alles in C# ist "der am stärksten eingeschränkte Zugang, den Sie für dieses Mitglied angeben können" .
So zum Beispiel:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
ist gleichbedeutend mit
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Die einzige Ausnahme hiervon ist, dass ein Teil einer Eigenschaft (in der Regel der Setter) stärker eingeschränkt wird als die deklarierte Zugänglichkeit der Eigenschaft selbst:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
So steht es in der C# 3.0 Spezifikation (Abschnitt 3.5.1):
Je nach dem Kontext, in dem ein Member-Deklaration stattfindet, können nur bestimmte Arten von deklarierten Zugänglichkeiten erlaubt. Außerdem, wenn eine Memberdeklaration keine Zugriffsmodifikatoren enthält, der Kontext, in dem die Deklaration der Kontext, in dem die Deklaration stattfindet, die Standard deklarierte Zugänglichkeit.
- Namensräume haben implizit eine öffentlich deklarierte Zugänglichkeit. Kein Zugriff Modifikatoren sind bei Namespace Deklarationen erlaubt.
- Typen, die in Kompilationseinheiten oder Namensräumen deklariert sind, können öffentliche oder intern deklarierte Zugänglichkeit und standardmäßig auf intern deklarierte Zugänglichkeit.
- Klassenmitglieder können jede der fünf Arten der deklarierten Zugänglichkeit haben und standardmäßig private deklarierte Zugänglichkeit. (Beachten Sie, dass ein Typ der als Mitglied einer Klasse deklariert ist, kann jede der fünf Arten der deklarierten Zugänglichkeit haben kann, während ein Typ, der als Mitglied eines Namensraumes deklariert ist, kann nur öffentliche oder interne deklarierte Zugänglichkeit).
- Strukturmitglieder können als öffentlich, intern oder privat deklariert sein Zugang haben und standardmäßig privat deklarierte Zugänglichkeit, weil Structs implizit versiegelt sind. Strukturmitglieder die in einer Struktur eingeführt werden (d.h. nicht von dieser Struktur geerbt) können nicht geschützt oder geschützt intern deklarierte Zugänglichkeit haben. (Beachten Sie, dass ein Typ, der als Mitglied einer struct deklarierte Typ öffentlich, intern oder privat sein kann deklarierte Zugänglichkeit haben kann, während ein Typ der als Mitglied eines Namespaces deklariert ist deklariert ist, nur öffentliche oder interne deklarierte Zugänglichkeit haben kann).
- Die Mitglieder der Schnittstelle haben implizit eine öffentlich deklarierte Zugänglichkeit. Keine Zugriffsmodifikatoren sind erlaubt für Deklarationen von Schnittstellenmitgliedern erlaubt.
- Aufzählungsmitglieder haben implizit eine öffentlich deklarierte Zugänglichkeit. Keine Zugriffsmodifikatoren sind erlaubt bei Deklarationen von Aufzählungsmitgliedern erlaubt.
(Beachten Sie, dass verschachtelte Typen unter die Teile "class members" oder "struct members" fallen würden - und daher standardmäßig privat sichtbar sind).
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
Dies macht nicht deutlich, dass eine Klasse, die auch ein Mitglied ist (weil sie ein verschachtelter Typ ist), standardmäßig privat ist. Außerdem sind die Mitglieder einer Schnittstelle und eines Enums immer öffentlich.
@niry Nein, es ist nicht privat. Es ist öffentlich. Es bekommt nur keinen Platz im implementierenden Typ, wenn also class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
können Sie nicht zugreifen M
con a.M()
Sie können jedoch auf sie zugreifen mit (a as IFoo).M()
. (Weitere Informationen zu den Einzelheiten finden Sie in der Spezifikation)
Kurze Antwort: minimaler Zugang (vgl. die Antwort von Jon Skeet).
Lange Antwort:
Nicht verschachtelt Typen, Aufzählungen und Zugriffsmöglichkeiten von Delegaten ( dürfen nur intern oder öffentlich zugänglich sein )
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | public, internal interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
Verschachtelt Typ und Zugriffsmöglichkeiten der Mitglieder
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | All¹ interface | public | All¹ class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ enum member | public | none (always implicitly public) interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ Alle === öffentlich, geschützt, intern, privat, geschützt intern
² structs können nicht von structs oder Klassen erben (wohl aber von Schnittstellen), daher ist protected kein gültiger Modifikator
Die Zugänglichkeit eines verschachtelten Typs hängt von seinem Zugänglichkeitsbereich ab, der sowohl durch die deklarierte Zugänglichkeit des Elements als auch durch den Zugänglichkeitsbereich des unmittelbar enthaltenen Typs bestimmt wird. Der Zugänglichkeitsbereich eines verschachtelten Typs kann jedoch nicht größer sein als der des enthaltenden Typs.
Anmerkung: CIL enthält auch die Bestimmung für geschützt und intern (im Gegensatz zu dem bestehenden geschützten "oder" intern), aber meines Wissens ist dies derzeit nicht für die Verwendung in C# verfügbar.
Ver:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(Mann, ich liebe Microsoft-URLs...)
Diese Antwort ist teilweise falsch. Nicht verschachtelte Enums können auch intern sein. Verschachtelte Enums und Schnittstellen können alles von öffentlich bis privat sein.
Sie können den Text gerne bearbeiten, wenn Sie sich sicher sind, dass Sie ihn verstanden haben. Ich kenne C# nicht mehr...
Mit C# 8 können wir jetzt auch private und geschützte Schnittstellenmitglieder haben. jeremybytes.blogspot.com/2019/11/
Werfen Sie einen Blick auf Zugriffsmodifikatoren (C# Programmierhandbuch)
Zugänglichkeit von Klassen und Strukturen
Klassen und Strukturen, die direkt in einem Namensraum deklariert werden (d.h. die nicht in anderen Klassen oder Strukturen verschachtelt sind), können entweder öffentlich oder intern sein. Intern ist der Standard, wenn kein Zugriffsmodifikator angegeben ist.
Strukturmitglieder, einschließlich verschachtelter Klassen und Strukturen, können als öffentlich, intern oder privat deklariert werden. Klassenmitglieder, einschließlich verschachtelter Klassen und Strukturen, können öffentlich, geschützt, intern, geschützt, intern, privat, geschützt oder privat sein. Die Zugriffsebene für Klassenmitglieder und Strukturmitglieder, einschließlich verschachtelter Klassen und Strukturen, ist standardmäßig privat. Private verschachtelte Typen sind von außerhalb des enthaltenden Typs nicht zugänglich.
Abgeleitete Klassen können keine größere Zugänglichkeit haben als ihre Basistypen. Mit anderen Worten: Sie können keine öffentliche Klasse B haben, die von einer internen Klasse A abgeleitet ist. Wäre dies erlaubt, würde dies dazu führen, dass A öffentlich wird, da alle geschützten oder internen Mitglieder von A von der abgeleiteten Klasse aus zugänglich sind.
Sie können bestimmten anderen Assemblies den Zugriff auf Ihre internen Typen ermöglichen, indem Sie die
InternalsVisibleToAttribute
. Weitere Informationen finden Sie unter Freundesversammlungen.Zugänglichkeit von Klassen- und Strukturmitgliedern
Klassenmitglieder (einschließlich verschachtelter Klassen und Structs) können mit jeder der sechs Zugriffsarten deklariert werden. Strukturmitglieder können nicht als geschützt deklariert werden, da Strukturen keine Vererbung unterstützen.
Normalerweise ist die Zugänglichkeit eines Elements nicht größer als die Zugänglichkeit des Typs, der es enthält. Ein öffentliches Mitglied einer internen Klasse kann jedoch von außerhalb der Assembly zugänglich sein, wenn das Mitglied Schnittstellenmethoden implementiert oder virtuelle Methoden außer Kraft setzt, die in einer öffentlichen Basisklasse definiert sind.
Der Typ eines Mitglieds, das ein Feld, eine Eigenschaft oder ein Ereignis ist, muss mindestens so zugänglich sein wie das Mitglied selbst. In ähnlicher Weise müssen der Rückgabetyp und die Parametertypen jedes Mitglieds, das eine Methode, ein Indexer oder ein Delegat ist, mindestens so zugänglich sein wie das Mitglied selbst. So kann beispielsweise eine öffentliche Methode M, die eine Klasse C zurückgibt, nur dann öffentlich sein, wenn C ebenfalls öffentlich ist. Ebenso können Sie keine geschützte Eigenschaft des Typs A haben, wenn A als privat deklariert ist.
Benutzerdefinierte Operatoren müssen immer als öffentlich und statisch deklariert werden. Weitere Informationen finden Sie unter Überladen von Operatoren.
Finalisten können keine Zugänglichkeitsmodifikatoren haben.
Andere Typen
Schnittstellen, die direkt in einem Namensraum deklariert werden, können als öffentlich oder intern deklariert werden, und genau wie Klassen und Strukturen sind Schnittstellen standardmäßig intern zugänglich. Schnittstellenmitglieder sind immer öffentlich, da der Zweck einer Schnittstelle darin besteht, anderen Typen den Zugriff auf eine Klasse oder Struktur zu ermöglichen. Auf Schnittstellenmitglieder können keine Zugriffsmodifikatoren angewendet werden.
Aufzählungsmitglieder sind immer öffentlich, und es können keine Zugriffsmodifikatoren angewendet werden.
Delegierte verhalten sich wie Klassen und Strukturen. Standardmäßig haben sie internen Zugriff, wenn sie direkt in einem Namespace deklariert sind, und privaten Zugriff, wenn sie verschachtelt sind.
Klasse ist Intern standardmäßig.
Schnittstelle ist Intern standardmäßig.
Schnittstellenmitglieder sind öffentlich standardmäßig. (Interfaces erlauben es nicht uns nicht, irgendeine Art von Zugänglichkeit zu ihren Mitgliedern festzulegen.)
Note : Wenn Sie versuchen, einen Zugriffsspezifizierer für die Mitglieder der Schnittstelle anzugeben, wird ein Kompilierungsfehler angezeigt.
Struktur ist Intern standardmäßig.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.