Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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
protectedquando pretender que classes derivadas em qualquer assembly acedam ao membro - Use
protected internalquando quiser o acesso mais permissivo (qualquer classe no mesmo assembly OU classes derivadas em qualquer lugar) - Use
private protectedquando 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#.