Compartilhar via


private protected (referência do 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 somente dentro da sua própria assemblagem. Para obter uma comparação com os outros modificadores de private protected acesso, consulte Níveis de Acessibilidade.

Observação

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

Exemplo

Um membro particular protegido de uma classe base é acessível de tipos derivados em seu assembly recipiente apenas se o tipo estático da variável é o tipo da 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 BaseClassbase pública e um tipo derivado dele. DerivedClass1 BaseClass possui um membro protegido privado, myValue que DerivedClass1 pode acessar como um membro herdado no mesmo assembly.

No segundo arquivo, uma tentativa de acessar myValue como um membro herdado de DerivedClass2 produzirá um erro, porque os membros de private protected só podem ser acessados por tipos derivados no mesmo assembly. Essa é 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 denomina Assembly2, a classe DerivedClass2 derivada terá acesso aos membros private protected declarados em BaseClass. InternalsVisibleTo torna os membros private protected visíveis para 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 protegidos:

Modificador de Acesso Mesma assembly, Classe derivada Mesmo assemblagem, classe não derivada Montagem diferente, classe derivada
protected ✔️ ✔️
protected internal ✔️ ✔️ ✔️
private protected ✔️
  • Use protected para que classes derivadas em qualquer assembly possam acessar o 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 da struct não podem ser private protected porque uma struct não pode ser herdada.

Especificação da linguagem C#

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

Consulte também