Udostępnij przez


ochrona prywatna (odwołanie w C#)

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#.

Zobacz także