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

Alle Typen und Typmember verfügen über eine Zugriffsebene.All types and type members have an accessibility level. Diese Zugriffsebene steuert, ob sie von anderem Code in Ihrer Assembly oder anderen Assemblys verwendet werden können.The accessibility level controls whether they can be used from other code in your assembly or other assemblies. Mithilfe der folgenden Zugriffsmodifizierer können Sie den Zugriff auf einen Typ oder Member festlegen, wenn Sie ihn deklarieren:Use the following access modifiers to specify the accessibility of a type or member when you declare it:

  • public: Auf den Typ oder Member kann von jedem Code in der gleichen Assembly oder einer anderen Assembly, die darauf verweist, zugegriffen werden.public: The type or member can be accessed by any other code in the same assembly or another assembly that references it.
  • private: Der Zugriff auf den Typ oder Member kann nur über Code innerhalb derselben class- oder struct-Instanz erfolgen.private: The type or member can be accessed only by code in the same class or struct.
  • protected: Der Zugriff auf den Typ oder Member kann nur über Code in derselben class- oder in einer class-Instanz erfolgen, die von dieser class-Instanz abgeleitet wurde.protected: The type or member can be accessed only by code in the same class, or in a class that is derived from that class.
  • internal: Auf den Typ oder Member kann von jedem Code in der gleichen Assembly zugegriffen werden, jedoch nicht von Code in einer anderen Assembly.internal: The type or member can be accessed by any code in the same assembly, but not from another assembly.
  • protected internal: Der Zugriff auf den Typ oder Member kann über beliebigen Code in der Assembly, in der er deklariert wurde, oder innerhalb einer abgeleiteten class-Instanz in einer anderen Assembly erfolgen.protected internal: The type or member can be accessed by any code in the assembly in which it's 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 class-Instanz oder in einem Typ zugegriffen werden, der von dieser class-Instanz 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 sind für alle Typen oder Member in allen Kontexten gültig.Not all access modifiers are valid for all types or members in all contexts. In manchen Fällen wird der Zugriff auf ein Typmember durch den Zugriff des enthaltenden Typs eingeschränkt.In some cases, the accessibility of a type member is constrained by the accessibility of its containing type.

Zugriff auf Klassen 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 die Zugriffsebenen public oder internal aufweisen.Classes and structs declared directly within a namespace (in other words, that aren't nested within other classes or structs) can be either public or internal. Wenn kein Zugriffsmodifizierer 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 public, internal oder private deklariert werden.Struct members, including nested classes and structs, can be declared public, internal, or private. Für Klassenmember, einschließlich geschachtelter Klassen und Strukturen, kann public, protected internal, protected, internal, private protected oder private deklariert werden.Class members, including nested classes and structs, can be public, protected internal, protected, internal, private protected, or private. Klassen und Strukturmember, einschließlich geschachtelter Klassen und Strukturen, weisen standardmäßig private-Zugriff auf.Class and struct members, including nested classes and structs, have private access by default. Auf private geschachtelte Typen kann nicht von außerhalb des enthaltenden Typs zugegriffen werden.Private nested types aren't accessible from outside the containing type.

Abgeleitete Klassen können keine höhere Verfügbarkeit als ihre Basistypen aufweisen.Derived classes can't have greater accessibility than their base types. Sie können keine öffentliche B-Klasse deklarieren, die von einer internen A-Klasse abgeleitet wird.You can't declare a public class B that derives from an internal class A. Wenn dies zulässig wäre, würde A als öffentlich festgelegt werden, da der Zugriff auf alle protected- oder internal-Member von A über die abgeleitete Klasse möglich wäre.If allowed, it would have the effect of making A public, because all protected or internal members of A are accessible from the derived class.

Mithilfe von InternalsVisibleToAttribute können Sie den Zugriff auf Ihre internen Typen durch spezifische andere Assemblys 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 protected, protected internal oder private protected deklariert werden, da Strukturen die Vererbung nicht unterstützen.Struct members can't be declared as protected, protected internal, or private protected because structs don't 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 isn't greater than the accessibility of the type that contains it. Allerdings kann auf einen public-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 aller Memberfelder, -eigenschaften oder -ereignisse muss mindestens über den Member selbst zugänglich sein.The type of any member field, property, or event must be at least as accessible as the member itself. Ebenso müssen der Rückgabetyp und die Parametertypen von Methoden, Indexer oder Delegaten mindestens so zugänglich wie der Member selbst sein.Similarly, the return type and the parameter types of any method, indexer, or delegate must be at least as accessible as the member itself. Sie können beispielsweise keine M-Methode mit der Zugriffsebene public verwenden, die eine C-Klasse zurückgibt, es sei denn, C verfügt ebenfalls über die Zugriffsebene public.For example, you can't have a public method M that returns a class C unless C is also public. Ebenso können Sie keine protected-Eigenschaft vom Typ A verwenden, wenn A als private deklariert ist.Likewise, you can't have a protected property of type A if A is declared as private.

Benutzerdefinierte Operatoren müssen immer als public und static deklariert werden.User-defined operators must always be declared as public and static. Weitere Informationen finden Sie unter Operatorüberladung.For more information, see Operator overloading.

Finalizer können nicht über Zugriffsmodifizierer verfügen.Finalizers can't have accessibility modifiers.

Fügen Sie wie im folgenden Beispiel gezeigt das entsprechende Schlüsselwort zur Memberdeklaration hinzu, um die Zugriffsebene für einen class- oder struct-Member festzulegen.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; }
    }
}

Andere TypenOther types

Schnittstellen, die direkt in einem Namespace deklariert wurden, können die Zugriffsebene public oder internal aufweisen. Außerdem verfügen Schnittstellen wie Klassen und Strukturen standardmäßig über internal-Zugriff.Interfaces declared directly within a namespace can be public or internal and, just like classes and structs, interfaces default to internal access. Für Schnittstellenmember ist standardmäßig public festgelegt, da es der Zweck einer Schnittstelle ist, anderen Typen den Zugriff auf eine Klasse oder Struktur zu ermöglichen.Interface members are public by default because the purpose of an interface is to enable other types to access a class or struct. Schnittstellenmemberdeklarationen können einen beliebigen Zugriffsmodifizierer aufweisen.Interface member declarations may include any access modifier. Das ist für statische Methoden besonders nützlich, um allgemeine Implementierungen bereitzustellen, die von allen Implementierern einer Klasse benötigt werden.This is most useful for static methods to provide common implementations needed by all implementors of a class.

Enumerationsmember weisen immer die Zugriffsebene public auf, 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. Sie verfügen standardmäßig über internal-Zugriff, wenn sie in einem Namespace deklariert wurden, sie verfügen über private-Zugriff, wenn sie geschachtelt sind.By default, they have internal access when declared directly within a namespace, and private access when nested.

C#-SprachspezifikationC# language specification

Weitere Informationen erhalten Sie unter C#-Sprachspezifikation.For more information, see the C# Language Specification. Die Sprachspezifikation ist die verbindliche Quelle für die Syntax und Verwendung von C#.The language specification is the definitive source for C# syntax and usage.

Siehe auchSee also