Partilhar via


private protected (Referência C#)

A private protected combinação de palavras-chave é um modificador de acesso de membro. Um membro protegido privado é acessível por tipos derivados da classe que a contém, mas apenas dentro do seu assembly de contenção. Para obter uma comparação com os outros modificadores de acesso, consulte Níveis de private protectedacessibilidade.

Observação

O private protected modificador de acesso é válido em C# versão 7.2 e posterior.

Exemplo

Um membro privado protegido de uma classe base só é acessível a partir de tipos derivados em seu assembly de contenção se o tipo estático da variável for o tipo de classe derivada. Por exemplo, considere o seguinte segmento de código:

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

Este exemplo contém dois arquivos Assembly1.cs e Assembly2.cs. O primeiro arquivo contém uma classe base pública, BaseClass, e um tipo derivado dela, DerivedClass1. BaseClass possui um membro privado protegido, myValueque DerivedClass1 pode acessar como um membro herdado dentro da mesma assembleia.

No segundo arquivo, uma tentativa de acessar myValue como um membro herdado de DerivedClass2 produzirá um erro, porque private protected os membros só são acessíveis por tipos derivados dentro do mesmo assembly. Esta é a principal diferença de protected (que permite o acesso de classes derivadas em qualquer assembly) e protected internal (que permite o acesso de qualquer classe dentro do mesmo assembly ou classes derivadas em qualquer assembly).

Se Assembly1.cs contiver um InternalsVisibleToAttribute que nomeia Assembly2, a classe derivada DerivedClass2 terá acesso aos membros private protected declarados em BaseClass. InternalsVisibleTo torna private protected os membros acessíveis a classes derivadas em outros assemblies.

Comparação com outros modificadores de acesso protegido

A tabela a seguir resume as principais diferenças entre os três modificadores de acesso protegido:

Modificador de acesso Mesma montagem, classe derivada Mesma montagem, classe não derivada Montagem diferente, classe derivada
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • Use protected quando pretender que classes derivadas em qualquer assembly acedam ao membro
  • Use protected internal quando quiser o acesso mais permissivo (qualquer classe no mesmo assembly OU classes derivadas em qualquer lugar)
  • Use private protected quando quiser o acesso protegido mais restritivo (somente classes derivadas no mesmo assembly)

Os membros do struct não podem ser private protected porque o struct não pode ser herdado.

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

Ver também