Udostępnij przez


protected internal (odwołanie w C#)

Kombinacja słowa kluczowego protected internal jest modyfikatorem dostępu do elementów. Dostęp do chronionego elementu wewnętrznego można uzyskać z bieżącego zestawu lub z typów, które pochodzą z zawierającej klasy. Aby zapoznać się z protected internal 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#.

Dowolny typ w zestawie zawierającym może uzyskać dostęp do chronionego wewnętrznego elementu członkowskiego klasy bazowej. Klasa pochodna znajdująca się w innym zestawie może uzyskać dostęp do składowej tylko wtedy, gdy dostęp występuje za pośrednictwem zmiennej typu klasy pochodnej. Rozważmy na przykład następujący segment kodu:

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
   protected internal int myValue = 0;
}

class TestAccess
{
    void Access()
    {
        var baseObject = new BaseClass();
        baseObject.myValue = 5;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClass : BaseClass
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();

        // Error CS1540, because myValue can only be accessed by
        // classes derived from BaseClass.
        // baseObject.myValue = 10;

        // OK, because this class derives from BaseClass.
        derivedObject.myValue = 10;
    }
}

Ten przykład zawiera dwa pliki: Assembly1.cs i Assembly2.cs. Pierwszy plik zawiera publiczną klasę bazową , BaseClassi inną klasę TestAccess. BaseClassjest właścicielem chronionego wewnętrznego elementu członkowskiego , do którego TestAccess typ uzyskuje dostęp, myValueponieważ znajduje się on w tym samym zestawie. W drugim pliku próba uzyskania dostępu myValue za pośrednictwem wystąpienia BaseClass generuje błąd, podczas gdy dostęp do tego elementu członkowskiego za pośrednictwem wystąpienia klasy DerivedClass pochodnej zakończy się powodzeniem. Ta reguła dostępu pokazuje, że protected internal umożliwia dostęp z dowolnej klasy w ramach tego samego zestawu lub klas pochodnych w dowolnym zestawie, co czyni go najbardziej permissive modyfikatorów dostępu chronionego.

Nie protected internal można dziedziczyć składowych struktury, ponieważ nie można dziedziczyć struktury.

Zastępowanie chronionych składowych wewnętrznych

Po zastąpieniu wirtualnego elementu członkowskiego modyfikator ułatwień dostępu metody zastąpienia zależy od zestawu, w którym definiuje się klasę pochodną.

Po zdefiniowaniu klasy pochodnej w tym samym zestawie co klasa bazowa wszystkie przesłonięte składowe mają protected internal dostęp. Jeśli zdefiniujesz klasę pochodną w innym zestawie niż klasa bazowa, przesłonięte składowe mają protected dostęp.

// Assembly1.cs
// Compile with: /target:library
public class BaseClass
{
    protected internal virtual int GetExampleValue()
    {
        return 5;
    }
}

public class DerivedClassSameAssembly : BaseClass
{
    // Override to return a different example value, accessibility modifiers remain the same.
    protected internal override int GetExampleValue()
    {
        return 9;
    }
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
class DerivedClassDifferentAssembly : BaseClass
{
    // Override to return a different example value, since this override
    // method is defined in another assembly, the accessibility modifiers
    // are only protected, instead of protected internal.
    protected override int GetExampleValue()
    {
        return 2;
    }
}

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