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.
Kombinacja słowa kluczowego private protected jest modyfikatorem dostępu do elementów. Prywatny chroniony element członkowski jest dostępny dla typów pochodzących z klasy, która je zawiera, ale tylko w ramach tego samego zestawu. Aby zapoznać się z private protected porównaniem z innymi modyfikatorami dostępu, zobacz Poziomy ułatwień dostępu.
Uwaga / Notatka
Modyfikator private protected dostępu jest prawidłowy w języku C# w wersji 7.2 lub nowszej.
Przykład
Prywatny chroniony element członkowski klasy bazowej jest dostępny dla typów pochodnych w zestawie wyłącznie wtedy, gdy statyczny typ zmiennej jest typem klasy pochodnej. Rozważmy na przykład następujący segment kodu:
// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
private protected int myValue = 0;
}
public class DerivedClass1 : BaseClass
{
void Access()
{
var baseObject = new BaseClass();
// Error CS1540, because myValue can only be accessed by
// classes derived from BaseClass.
// baseObject.myValue = 5;
// OK, accessed through the current derived class instance
myValue = 5;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass2 : BaseClass
{
void Access()
{
// Error CS0122, because myValue can only be
// accessed by types in Assembly1
// myValue = 10;
}
}
Ten przykład zawiera dwa pliki: Assembly1.cs i Assembly2.cs.
Pierwszy plik zawiera publiczną klasę bazową , BaseClassi typ pochodzący z niego. DerivedClass1
BaseClass posiada prywatnego chronionego członka, myValue, do którego DerivedClass1 może mieć dostęp jako dziedziczonego członka wewnątrz tego samego zestawu.
W drugim pliku próba uzyskania dostępu do myValue jako odziedziczonego elementu członkowskiego DerivedClass2 spowoduje wystąpienie błędu, ponieważ elementy członkowskie private protected są dostępne wyłącznie dla typów pochodnych tylko w ramach tego samego zestawu. Jest to kluczowa różnica między protected (która umożliwia dostęp z klas pochodnych w dowolnym zestawie) i protected internal (która umożliwia dostęp z dowolnej klasy w ramach tego samego zestawu lub klas pochodnych w dowolnym zestawie).
Jeśli Assembly1.cs zawiera InternalsVisibleToAttribute, które nazywa Assembly2, klasa pochodna DerivedClass2 będzie miała dostęp do składowych private protected zadeklarowanych w BaseClass.
InternalsVisibleTo sprawia, że private protected elementy członkowskie są widoczne dla klas pochodnych w innych zestawach.
Porównanie z innymi modyfikatorami dostępu chronionego
Poniższa tabela zawiera podsumowanie najważniejszych różnic między trzema modyfikatorami dostępu chronionego:
| Modyfikator dostępu | Ten sam zestaw, klasa pochodna | Ten sam zestaw, klasa nie pochodna | Inny zestaw, klasa pochodna |
|---|---|---|---|
protected |
✔️ | ❌ | ✔️ |
protected internal |
✔️ | ✔️ | ✔️ |
private protected |
✔️ | ❌ | ❌ |
- Użyj
protected, jeśli chcesz, aby klasy pochodne w dowolnym zestawie uzyskiwały dostęp do członka - Użyj
protected internal, jeśli chcesz uzyskać najbardziej permissywny dostęp (dowolna klasa w tym samym zestawie LUB klasach pochodnych w dowolnym miejscu) - Użyj
private protected, jeśli chcesz uzyskać najbardziej restrykcyjny dostęp chroniony (tylko klasy pochodne w tym samym zestawie)
Składowe struktury nie mogą być private protected, ponieważ struktura nie może być dziedziczona.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.