Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Słowo kluczowe protected jest modyfikatorem dostępu.
Uwaga / Notatka
Ta strona obejmuje protected dostęp. Słowo kluczowe protected jest również częścią protected internal i private protected modyfikatorów dostępu.
Chroniony członek jest dostępny w ramach swojej klasy oraz przez instancje klas pochodnych.
Aby zapoznać się z protected porównaniem z innymi modyfikatorami dostępu, zobacz Poziomy ułatwień dostępu.
Przykład 1
Chroniony element członkowski klasy bazowej jest dostępny w klasie pochodnej tylko wtedy, gdy dostęp występuje za pośrednictwem typu klasy pochodnej. Rozważmy na przykład następujący segment kodu:
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;
}
}
}
Wyrażenie baseObject.myValue = 10 powoduje błąd, ponieważ próbuje uzyskać dostęp do chronionego elementu członkowskiego za pośrednictwem odwołania do klasy bazowej (baseObject jest typu BaseClass). Dostęp do chronionych składowych można uzyskać tylko za pośrednictwem typu klasy pochodnej lub typów pochodnych.
W przeciwieństwie do private protected, modyfikator dostępu protected umożliwia dostęp z klas pochodnych w dowolnym zestawieniu. W przeciwieństwie do protected internal, nie zezwala na dostęp z klas nie będących pochodnymi w tym samym zestawie.
Nie można chronić składowych struktury, ponieważ nie można dziedziczyć struktury.
Przykład 2
W tym przykładzie klasa DerivedPoint pochodzi z Point. W związku z tym można uzyskać dostęp do chronionych składowych klasy bazowej bezpośrednio z klasy pochodnej.
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
}
Jeśli zmienisz poziomy dostępu i xy na prywatny, kompilator wyświetli komunikaty o błędach:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
Dostęp między zestawami
Następujący przykład pokazuje, że protected członkowie są dostępni z klas pochodnych nawet wtedy, gdy znajdują się w różnych assembly.
// 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;
}
}
}
Ta dostępność między zestawami protected różni się od private protected (co ogranicza dostęp do tego samego zestawu), ale jest podobne do protected internal (choć protected internal umożliwia również dostęp do tego samego zestawu z klas nie pochodnych).
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Zadeklarowane ułatwienia dostępu w specyfikacji języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.