Was ist der Standardzugriffsmodifikator für Klassen, Methoden, Mitglieder, Konstruktoren, Delegaten und Schnittstellen?
quelle
Was ist der Standardzugriffsmodifikator für Klassen, Methoden, Mitglieder, Konstruktoren, Delegaten und Schnittstellen?
Der Standardzugriff für alles in C # ist "der am meisten eingeschränkte Zugriff, den Sie für dieses Mitglied deklarieren können" .
Also zum Beispiel:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
ist äquivalent zu
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
Die einzige Ausnahme besteht darin, dass ein Teil einer Eigenschaft (normalerweise der Setter) eingeschränkter ist als die deklarierte Zugänglichkeit der Eigenschaft selbst:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Dies ist, was die C # 3.0-Spezifikation zu sagen hat (Abschnitt 3.5.1):
Abhängig vom Kontext, in dem eine Mitgliedererklärung stattfindet, sind nur bestimmte Arten der deklarierten Zugänglichkeit zulässig. Wenn eine Mitgliedsdeklaration keine Zugriffsmodifikatoren enthält, bestimmt der Kontext, in dem die Deklaration stattfindet, die standardmäßig deklarierte Zugänglichkeit.
- Namespaces haben implizit öffentlich deklarierte Zugänglichkeit. Für Namespace-Deklarationen sind keine Zugriffsmodifikatoren zulässig.
- In Kompilierungseinheiten oder Namespaces deklarierte Typen können öffentlich oder intern deklariert sein und standardmäßig intern deklariert sein.
- Klassenmitglieder können eine der fünf Arten der deklarierten Zugänglichkeit haben und standardmäßig die private deklarierte Zugänglichkeit verwenden. (Beachten Sie, dass ein als Mitglied einer Klasse deklarierter Typ eine der fünf Arten der deklarierten Zugänglichkeit haben kann, während ein als Mitglied eines Namespace deklarierter Typ nur öffentliche oder interne deklarierte Zugänglichkeit haben kann.)
- Strukturmitglieder können öffentlich, intern oder privat deklariert sein und standardmäßig privat deklariert sein, da Strukturen implizit versiegelt sind. Strukturelemente, die in einer Struktur eingeführt wurden (dh nicht von dieser Struktur geerbt wurden), können keine geschützte oder geschützte interne deklarierte Zugänglichkeit haben. (Beachten Sie, dass ein Typ, der als Mitglied einer Struktur deklariert ist, öffentlich, intern oder privat deklariert werden kann, während ein Typ, der als Mitglied eines Namespace deklariert ist, nur öffentlich oder intern deklariert werden kann.)
- Schnittstellenmitglieder haben implizit öffentlich deklarierte Zugänglichkeit. Für Deklarationen von Schnittstellenmitgliedern sind keine Zugriffsmodifikatoren zulässig.
- Aufzählungsmitglieder haben implizit öffentlich deklarierte Zugänglichkeit. Für Deklarationen von Aufzählungsmitgliedern sind keine Zugriffsmodifikatoren zulässig.
(Beachten Sie, dass verschachtelte Typen unter die Teile "Klassenmitglieder" oder "Strukturmitglieder" fallen und daher standardmäßig die private Sichtbarkeit verwenden.)
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!
class Foo : IFoo { IFoo.M() {} } ... Foo a = new Foo();
Sie keinen ZugriffM
mita.M()
, aber können Sie darauf zugreifen mit(a as IFoo).M()
. (Überprüfen Sie die Spezifikation für weitere Informationen zu denKurze Antwort: Mindestzugriff (vgl. Antwort von Jon Skeet).
Lange Antwort:
Nicht verschachtelte Typen, Aufzählung und delegierte Zugänglichkeiten ( möglicherweise nur interne oder öffentliche Zugänglichkeit )
Verschachtelte Zugänglichkeit für Typ und Mitglieder
Die Zugänglichkeit eines verschachtelten Typs hängt von seiner Zugänglichkeitsdomäne ab, die sowohl von der deklarierten Zugänglichkeit des Mitglieds als auch von der Zugänglichkeitsdomäne des unmittelbar enthaltenden Typs bestimmt wird. Die Eingabehilfendomäne eines verschachtelten Typs darf jedoch die des enthaltenden Typs nicht überschreiten.
Hinweis: CIL hat auch die Bestimmung für geschützt und intern (im Gegensatz zu den vorhandenen geschützten "oder" internen), aber meines Wissens ist dies derzeit nicht für die Verwendung in C # verfügbar.
Sehen:
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 URIs ...)
quelle
Schauen Sie sich Access Modifiers an (C # Programmierhandbuch).
quelle
Die Klasse ist standardmäßig intern .
Die Schnittstelle ist standardmäßig intern .
Schnittstellenmitglieder sind standardmäßig öffentlich . (Über Schnittstellen können wir keine Zugänglichkeit für die Mitglieder festlegen.)
Hinweis: Wenn Sie versuchen, den Mitgliedern der Schnittstelle einen Zugriffsspezifizierer anzugeben, wird ein Kompilierungsfehler angezeigt.
Struct ist standardmäßig intern .
quelle
Ich möchte einen Dokumentationslink hinzufügen. Weitere Details finden Sie hier .
quelle
Die einfachste Antwort ist die folgende .....
Alle Mitglieder in C # verwenden immer den standardmäßig MINDEST zugänglichen Modifikator.
Aus diesem Grund sind alle Klassen der obersten Ebene in einer Assembly standardmäßig "intern". Dies bedeutet, dass sie für die Assembly, in der sie sich befinden, öffentlich, aber privat oder vom Zugriff auf externe Assemblys ausgeschlossen sind. Die einzige andere Option für eine Klasse der obersten Ebene ist öffentlich, die leichter zugänglich ist. Für verschachtelte Typen ist alles privat, bis auf einige seltene Ausnahmen wie Mitglieder von Aufzählungen und Schnittstellen, die nur öffentlich sein können. Einige Beispiele. Bei Klassen und Schnittstellen der obersten Ebene sind die Standardeinstellungen:
Klasse Tier wie interne Klasse Tier
Schnittstelle Tier wie öffentliche Schnittstelle Tier
Bei verschachtelten Klassen und Schnittstellen (innerhalb von Typen) sind die Standardeinstellungen:
Klasse Tier wie Privatklasse Tier
Schnittstelle Tier wie private Schnittstelle Tier
Wenn Sie nur davon ausgehen, dass die Standardeinstellung immer die privateste ist, müssen Sie keine Accessoren verwenden, bis Sie die Standardeinstellung ändern müssen. Einfach.
quelle
Intern ist der Standardmodifikator
quelle
Namespace-Ebene:
internal
Typstufe:
private
quelle