protected internal (referência do C#)

A combinação de palavras-chave protected internal é um modificador de acesso de membro. Um membro protegido interno é acessível no assembly atual ou nos tipos que derivam da classe recipiente. Para obter uma comparação de protected internal com os outros modificadores de acesso, consulte Níveis de acessibilidade.

Exemplo

Um membro protegido interno de uma classe base é acessível em qualquer tipo em seu assembly recipiente. Ele também é acessível em uma classe derivada localizada em outro assembly somente se o acesso ocorre por meio de uma variável do tipo de classe derivada. Por exemplo, considere o seguinte segmento de código:

// 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;
    }
}

Este exemplo contém dois arquivos, Assembly1.cs e Assembly2.cs. O primeiro arquivo contém uma classe base pública, BaseClass, e outra classe, TestAccess. BaseClass tem um membro interno protegido, myValue, que é acessado pelo tipo TestAccess. No segundo arquivo, uma tentativa de acessar myValue por meio de uma instância de BaseClass produzirá um erro, enquanto um acesso a esse membro por meio de uma instância de uma classe derivada, DerivedClass, terá êxito.

Membros de struct não podem ser protected internal porque o struct não pode ser herdado.

Substituindo membros internos protegidos

Ao substituir um membro virtual, o modificador de acessibilidade do método substituído depende do assembly em que a classe derivada é definida.

Quando a classe derivada é definida no mesmo assembly que a classe base, todos os membros substituídos têm acesso protected internal. Se a classe derivada for definida em um assembly diferente da classe base, os membros substituídos terão acesso protected.

// 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;
    }
}

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.

Confira também