Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das protected-Schlüsselwort ist ein Zugriffsmodifizierer für Member.
Hinweis
Auf dieser Seite wird der Zugriff auf protected behandelt. Das protected Schlüsselwort ist auch Teil der protected internal- und private protected-Zugriffsmodifizierer.
Auf ein geschütztes Element kann innerhalb der Klasse und durch abgeleitete Klasseninstanzen zugegriffen werden.
Einen Vergleich mit protected den anderen Zugriffsmodifizierern finden Sie unter Barrierefreiheitsstufen.
Beispiel 1
Auf ein geschütztes Element einer Basisklasse kann nur zugegriffen werden, wenn der Zugriff über den abgeleiteten Klassentyp erfolgt. Betrachten Sie beispielsweise das folgende Codesegment:
namespace Example1
{
class BaseClass
{
protected int myValue = 123;
}
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed through
// the derived class type, not through the base class type.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
}
Die Anweisung baseObject.myValue = 10 generiert einen Fehler, da sie über einen Basisklassenverweis (baseObject ist vom Typ BaseClass) auf das geschützte Element zugreift. Auf geschützte Member kann nur über den Typ der abgeleiteten Klasse oder von ihr abgeleitete Typen zugegriffen werden.
Im Gegensatz dazu private protectedermöglicht der protected Zugriffsmodifizierer den Zugriff von abgeleiteten Klassen in jeder Assembly. Im Gegensatz dazu protected internallässt es keinen Zugriff von nicht abgeleiteten Klassen innerhalb derselben Assembly zu.
Strukturmmber können nicht geschützt werden, da die Struktur nicht geerbt werden kann.
Beispiel 2
In diesem Beispiel wird die Klasse DerivedPoint von Point abgeleitet. Daher können Sie direkt von der abgeleiteten Klasse aus auf die geschützten Member der Basisklasse zugreifen.
namespace Example2
{
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
var dpoint = new DerivedPoint();
// Direct access to protected members.
dpoint.x = 10;
dpoint.y = 15;
Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
}
}
// Output: x = 10, y = 15
}
Wenn Sie die Zugriffsebenen von x und y zu privat ändern, gibt der Compiler die Fehlermeldungen aus:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
Assemblyübergreifender Zugriff
Im folgenden Beispiel wird veranschaulicht, dass protected-Member von abgeleiteten Klassen aus zugänglich sind, auch wenn sie sich in verschiedenen Assemblys befinden.
// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
public class BaseClass
{
protected int myValue = 0;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
using Assembly1;
class DerivedClass : BaseClass
{
void Access()
{
// OK, because protected members are accessible from
// derived classes in any assembly
myValue = 10;
}
}
}
Diese assemblyübergreifende Zugänglichkeit unterscheidet protected von private protected (was den Zugriff auf dieselbe Assembly einschränkt), ist jedoch protected internal ähnlich (wobei protected internal auch den Zugriff auf dieselbe Assembly von nicht abgeleiteten Klassen aus ermöglicht).
C#-Sprachspezifikation
Weitere Informationen finden Sie unter "Deklarierte Barrierefreiheit in der C#-Sprachspezifikation". Die Sprachspezifikation ist die endgültige Quelle für C#-Syntax und -Verwendung.