Udostępnij przez


protected internal (odwołanie w C#)

Kombinacja słowa kluczowego protected internal jest modyfikatorem dostępu do elementów. Chroniony element wewnętrzny jest dostępny 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.

Przykład

Chroniony wewnętrzny członek klasy bazowej jest dostępny z dowolnego typu w zestawie, w którym się znajduje. Jest również dostępny w klasie pochodnej znajdującej się w innym zestawie 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. BaseClass posiada chroniony element wewnętrznymyValue, do którego dostęp ma typ TestAccess, ponieważ są w tym samym zestawie. W drugim pliku próba uzyskania dostępu do myValue za pośrednictwem wystąpienia BaseClass spowoduje wystąpienie błędu, podczas gdy dostęp do tego elementu członkowskiego za pośrednictwem wystąpienia pochodnej klasy DerivedClass zakończy się powodzeniem. Pokazuje to, że protected internal umożliwia dostęp z dowolnej klasy w tym samym zestawie lub klasach pochodnych w dowolnym zestawie, dzięki czemu jest najbardziej liberalny z modyfikatorów dostępu chronionego.

Składowe struktury nie mogą być protected internal, ponieważ struktura nie może być dziedziczona.

Zastępowanie chronionych składowych wewnętrznych

Podczas zastępowania wirtualnego członka modyfikator dostępu metody przesłoniętej zależy od zestawu, w którym zdefiniowano klasę pochodną.

Gdy klasa pochodna jest zdefiniowana w tym samym zestawie co klasa bazowa, wszystkie nadpisane elementy mają protected internal dostęp. Jeśli klasa pochodna jest zdefiniowana 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