Partilhar via


private protected (Referência C#)

A private protected combinação de palavras-chave é um modificador de acesso de membro. Os tipos que derivam da classe e são declarados na assembleia contenda podem aceder a um membro privado protegido. Para obter uma comparação com os outros modificadores de acesso, consulte Níveis de private protectedacessibilidade.

A referência da linguagem C# documenta a versão mais recentemente lançada da linguagem C#. Contém também documentação inicial para funcionalidades em versões preliminares públicas para a próxima versão da linguagem.

A documentação identifica qualquer funcionalidade introduzida pela primeira vez nas últimas três versões da língua ou em pré-visualizações públicas atuais.

Sugestão

Para saber quando uma funcionalidade foi introduzida pela primeira vez em C#, consulte o artigo sobre o histórico de versões da linguagem C#.

Os tipos derivados podem aceder a um membro privado protegido de uma classe base no seu assembly contendo apenas 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 ficheiro, uma tentativa de aceder myValue como membro herdado de DerivedClass2 produz um erro, porque private protected os membros só são acessíveis por tipos derivados dentro do mesmo assembly. Esta restrição é a principal diferença entre protected (que permite o acesso de classes derivadas em qualquer assembly) e protected internal (que permite o acesso de qualquer classe dentro da mesma assembly ou classes derivadas em qualquer assembly).

Se Assembly1.cs contém um InternalsVisibleToAttribute que nomeia Assembly2, a classe DerivedClass2 derivada tem acesso a private protected membros 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 ✔️
  • Usa protected quando quiseres classes derivadas em qualquer assembly para aceder ao membro.
  • Usa protected internal quando quiseres o acesso mais permissivo (qualquer classe na mesma assembly ou classes derivadas em qualquer lugar).
  • Use private protected quando quiser o acesso protegido mais restritivo (apenas as classes derivadas na mesma assembleia).

Não podes declarar private protected membros da struct porque as structs não podem ser herdadas.

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