Zugriffsmodifizierer (C#-Programmierhandbuch)Access Modifiers (C# Programming Guide)

Alle Typen und Typmember haben eine Zugriffsebene, die steuert, ob sie von anderem Code in Ihrer Assembly oder anderen Assemblys verwendet werden können.All types and type members have an accessibility level, which controls whether they can be used from other code in your assembly or other assemblies. Sie können die folgenden Zugriffsmodifizierer verwenden, um den Zugriff auf einen Typ oder Member anzugeben, wenn Sie sie deklarieren:You can use the following access modifiers to specify the accessibility of a type or member when you declare it:

publicpublic
Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.The type or member can be accessed by any other code in the same assembly or another assembly that references it.

privateprivate
Auf den Typ oder Member kann nur von Code in der gleichen Klasse oder Struktur zugegriffen werden.The type or member can be accessed only by code in the same class or struct.

protectedprotected
Auf den Typ oder Member kann nur von Code in derselben Klasse oder in einer Klasse zugegriffen werden, die von dieser Klasse abgeleitet ist.The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
internalinternal
Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.The type or member can be accessed by any code in the same assembly, but not from another assembly.

protected internal Auf den Typ oder Member kann von beliebigem Code in der Assembly, in der er deklariert ist, oder von jeder abgeleiteten Klasse in einer anderen Assembly zugegriffen werden.protected internal The type or member can be accessed by any code in the assembly in which it is declared, or from within a derived class in another assembly.

private protected Auf den Typ oder Member kann nur innerhalb der deklarierenden Assembly, von Code in derselben Klasse oder in einem Typ zugegriffen werden, der von dieser Klasse abgeleitet ist.private protected The type or member can be accessed only within its declaring assembly, by code in the same class or in a type that is derived from that class.

Die folgenden Beispiele veranschaulichen, wie Zugriffsmodifizierer für einen Typ und Member angegeben werden:The following examples demonstrate how to specify access modifiers on a type and member:

public class Bicycle
{
    public void Pedal() { }
}

Nicht alle Zugriffsmodifizierer können von allen Typen oder Membern in allen Kontexten verwendet werden, und in einigen Fällen wird der Zugriff auf einen Typmember vom Zugriff auf den enthaltenden Typ eingeschränkt.Not all access modifiers can be used by all types or members in all contexts, and in some cases the accessibility of a type member is constrained by the accessibility of its containing type. Die folgenden Abschnitte enthalten ausführlichere Informationen zu diesem Zugriff.The following sections provide more details about accessibility.

Zugriff auf Klasse und StrukturenClass and Struct Accessibility

Klassen und Strukturen, die innerhalb eines Namespace (mit anderen Worten, die nicht in anderen Klassen oder Strukturen geschachtelt sind) direkt deklariert werden, können entweder öffentlich oder intern sein.Classes and structs that are declared directly within a namespace (in other words, that are not nested within other classes or structs) can be either public or internal. Wenn kein Modifizierer angegeben ist, wird standardmäßig „internal“ verwendet.Internal is the default if no access modifier is specified.

Strukturmember, einschließlich geschachtelter Klassen und Strukturen, können als öffentlich, intern oder privat deklariert werden.Struct members, including nested classes and structs, can be declared as public, internal, or private. Klassenmember, einschließlich geschachtelter Klassen und Strukturen, können als öffentlich, intern geschützt, geschützt, intern, privat geschützt oder privat definiert werden.Class members, including nested classes and structs, can be public, protected internal, protected, internal, private protected or private. Die Zugriffsebene für Klassenmember und Strukturmember, einschließlich geschachtelter Klassen und Strukturen, ist standardmäßig privat.The access level for class members and struct members, including nested classes and structs, is private by default. Auf private geschachtelte Typen kann nicht von außerhalb des enthaltenden Typs zugegriffen werden.Private nested types are not accessible from outside the containing type.

Abgeleitete Klassen können keine höhere Verfügbarkeit als ihre Basistypen aufweisen.Derived classes cannot have greater accessibility than their base types. Das heißt, dass Sie über keine öffentliche Klasse B verfügen können, die von einer internen Klasse A abgeleitet wird.In other words, you cannot have a public class B that derives from an internal class A. Wenn dies zulässig wäre, müssten Sie A öffentlich machen, da auf alle geschützten oder internen Member von A aus der abgeleiteten Klasse zugegriffen werden kann.If this were allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.

Sie können mithilfe des InternalsVisibleTo-Attributs bestimmten anderen Assemblys den Zugriff auf die internen Typen ermöglichen.You can enable specific other assemblies to access your internal types by using the InternalsVisibleToAttribute. Weitere Informationen finden Sie unter Friend-Assemblys.For more information, see Friend Assemblies.

Zugriff auf Klassen- und StrukturmemberClass and Struct Member Accessibility

Klassenmember (einschließlich geschachtelter Klassen und Strukturen) können mit einem der sechs Zugriffstypen deklariert werden.Class members (including nested classes and structs) can be declared with any of the six types of access. Strukturmember können nicht als geschützt deklariert werden, da Strukturen keine Vererbung unterstützen.Struct members cannot be declared as protected because structs do not support inheritance.

Normalerweise ist der Zugriff auf einen Member nicht höher als der Zugriff des Typs, der ihn enthält.Normally, the accessibility of a member is not greater than the accessibility of the type that contains it. Allerdings kann auf einen öffentlichen Member einer internen Klasse möglicherweise von außerhalb der Assembly zugegriffen werden, wenn der Member Schnittstellenmethoden implementiert oder virtuelle Methoden überschreibt, die in einer öffentlichen Basisklasse definiert sind.However, a public member of an internal class might be accessible from outside the assembly if the member implements interface methods or overrides virtual methods that are defined in a public base class.

Der Typ jedes Members, der ein Feld, eine Eigenschaft oder ein Ereignis ist, muss mindestens über dieselben Zugriffstypen verfügen wie der Member selbst.The type of any member that is a field, property, or event must be at least as accessible as the member itself. Ebenso müssen der Rückgabetyp und die Parametertypen eines Members, der eine Methode, Indexer oder Delegat ist, mindestens über dieselben Zugriffstypen verfügen, wie der Member selbst.Similarly, the return type and the parameter types of any member that is a method, indexer, or delegate must be at least as accessible as the member itself. Zum Beispiel können Sie nicht über eine öffentliche Methode M verfügen, die eine Klasse C zurückgibt, außer wenn C ebenfalls öffentlich ist.For example, you cannot have a public method M that returns a class C unless C is also public. Ebenso können Sie nicht über eine geschützte Eigenschaft des Typs A verfügen, wenn A als privat deklariert wurde.Likewise, you cannot have a protected property of type A if A is declared as private.

Benutzerdefinierte Operatoren müssen immer als öffentlich deklariert werden.User-defined operators must always be declared as public. Weitere Informationen finden Sie unter Operator (C#-Referenz).For more information, see operator (C# Reference).

Finalizer können nicht über Zugriffsmodifizierer verfügen.Finalizers cannot have accessibility modifiers.

Um die Zugriffsebene für eine Klasse oder Struktur festzulegen, fügen Sie das entsprechende Schlüsselwort zur Memberdeklaration hinzu, wie im folgenden Beispiel dargestellt.To set the access level for a class or struct member, add the appropriate keyword to the member declaration, as shown in the following example.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return wheels; }
    }
}

Hinweis

Die geschützte interne Zugriffsebene heißt geschützt ODER intern, nicht geschützt UND intern.The protected internal accessibility level means protected OR internal, not protected AND internal. Anders gesagt, kann auf einen geschützten internen Member aus einer Klasse in der gleichen Assembly, einschließlich der abgeleiteten Klassen, zugegriffen werden.In other words, a protected internal member can be accessed from any class in the same assembly, including derived classes. Um Zugriff auf abgeleitete Klassen in derselben Assembly zu beschränken, deklarieren Sie die Klasse selbst als intern, und ihre Member als geschützt.To limit accessibility to only derived classes in the same assembly, declare the class itself internal, and declare its members as protected. Außerdem können Sie ab C# 7.2 den Zugriffsmodifizierer „private protected“ verwenden, um dasselbe Ergebnis zu erzielen, ohne die enthaltende Klasse als intern zu deklarieren.Also, starting with C# 7.2, you can use the private protected access modifier to achieve the same result without need to make the containing class internal.

Andere TypenOther Types

Schnittstellen, die direkt innerhalb eines Namespace deklariert werden, können als öffentlich oder intern deklariert werden, und haben wie Klassen und Strukturen standardmäßig internen Zugriff.Interfaces declared directly within a namespace can be declared as public or internal and, just like classes and structs, interfaces default to internal access. Schnittstellenmember sind immer öffentlich, da es der Zweck einer Schnittstelle ist, anderen Typen den Zugriff auf eine Klasse oder Struktur zu ermöglichen.Interface members are always public because the purpose of an interface is to enable other types to access a class or struct. Auf Schnittstellenmember können keine Zugriffsmodifizierer angewendet werden.No access modifiers can be applied to interface members.

Enumerationsmember sind immer öffentlich, und es können keine Zugriffsmodifizierer angewendet werden.Enumeration members are always public, and no access modifiers can be applied.

Delegaten verhalten sich wie Klassen und Strukturen.Delegates behave like classes and structs. Standardmäßig haben sie internen Zugriff, wenn Sie direkt innerhalb eines Namespace deklariert werden, und privaten Zugriff bei Schachtelung.By default, they have internal access when declared directly within a namespace, and private access when nested.

C#-ProgrammiersprachenspezifikationC# Language Specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide
Klassen und StrukturenClasses and Structs
SchnittstellenInterfaces
privateprivate
publicpublic
internalinternal
protectedprotected
protected internalprotected internal
private protectedprivate protected
classclass
structstruct
interfaceinterface