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
W tym artykule opisano protected dostęp. Słowo kluczowe protected jest również częścią protected internal i private protected modyfikatorów dostępu.
Dostęp do chronionego elementu członkowskiego można uzyskać w ramach klasy i według wystąpień klasy pochodnej.
Aby zapoznać się z protected porównaniem z innymi modyfikatorami dostępu, zobacz Poziomy ułatwień dostępu.
Dokumentacja języka C# zawiera ostatnio wydaną wersję języka C#. Zawiera również początkową dokumentację dla funkcjonalności w publicznych wersjach testowych nadchodzącego wydania języka.
Dokumentacja identyfikuje dowolną funkcję po raz pierwszy wprowadzoną w ostatnich trzech wersjach języka lub w bieżącej publicznej wersji zapoznawczej.
Wskazówka
Aby dowiedzieć się, kiedy funkcja została po raz pierwszy wprowadzona w języku C#, zapoznaj się z artykułem dotyczącym historii wersji języka C#.
Dostęp do chronionego elementu członkowskiego klasy bazowej w klasie pochodnej można uzyskać 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 internalklasy , nie zezwala na dostęp z klas innych niż pochodne w tym samym zestawie.
Nie można zadeklarować elementów członkowskich struktury jako chronionych, ponieważ nie można dziedziczyć struktur.
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 zwróci komunikaty o błędach:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
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#.