Partilhar via


protegido interno (Referência C#)

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

Exemplo

Um membro interno protegido de uma classe base é acessível a partir de qualquer tipo dentro de seu assembly que contém. Ele também é acessível em uma classe derivada localizada em outro assembly somente se o acesso ocorrer 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, BaseClasse outra classe, TestAccess. BaseClass possui um membro interno protegido, myValueque é acessado TestAccess pelo tipo. No segundo arquivo, uma tentativa de acesso 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.

Os membros do 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 onde a classe derivada é definida.

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

// 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 do C#.

Consulte também