Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A palavra-chave protected é um modificador de acesso de membro.
Observação
Esta página aborda o acesso protected. A protected palavra-chave também faz parte dos modificadores de acesso protected internal e private protected.
Um membro protegido é acessível dentro de sua classe e por instâncias de classe derivadas.
Para obter uma comparação com os outros modificadores de protected acesso, consulte Níveis de Acessibilidade.
Exemplo 1
Um membro protegido de uma classe base só poderá ser acessado em uma classe derivada se o acesso ocorrer por meio do tipo de classe derivada. Por exemplo, considere o seguinte segmento de código:
namespace Example1
{
class BaseClass
{
protected int myValue = 123;
}
class DerivedClass : BaseClass
{
static void Main()
{
var baseObject = new BaseClass();
var derivedObject = new DerivedClass();
// Error CS1540, because myValue can only be accessed through
// the derived class type, not through the base class type.
// baseObject.myValue = 10;
// OK, because this class derives from BaseClass.
derivedObject.myValue = 10;
}
}
}
A instrução baseObject.myValue = 10 gera um erro porque acessa o membro protegido por meio de uma referência de classe base (baseObject é do tipo BaseClass). Os membros protegidos só podem ser acessados por meio do tipo de classe derivada ou tipos derivados dele.
Ao contrário de private protected, o modificador de acesso protected permite o acesso de classes derivadas em qualquer assembly. Ao contrário de protected internal, ele não permite o acesso por classes não derivadas dentro do mesmo assembly.
Os membros Struct não podem ser protegidos porque o struct não pode ser herdado.
Exemplo 2
Neste exemplo, a classe DerivedPoint é derivada de Point. Portanto, você pode acessar os membros protegidos da classe base diretamente da classe derivada.
namespace Example2
{
class Point
{
protected int x;
protected int y;
}
class DerivedPoint: Point
{
static void Main()
{
var dpoint = new DerivedPoint();
// Direct access to protected members.
dpoint.x = 10;
dpoint.y = 15;
Console.WriteLine($"x = {dpoint.x}, y = {dpoint.y}");
}
}
// Output: x = 10, y = 15
}
Se você alterar os níveis de acesso de x e y para privado, o compilador emitirá as mensagens de erro:
'Point.y' is inaccessible due to its protection level.
'Point.x' is inaccessible due to its protection level.
Acesso entre assemblies
O exemplo a seguir demonstra que os membros de protected são acessíveis a partir de classes derivadas, mesmo quando estão em assemblies diferentes:
// Assembly1.cs
// Compile with: /target:library
namespace Assembly1
{
public class BaseClass
{
protected int myValue = 0;
}
}
// Assembly2.cs
// Compile with: /reference:Assembly1.dll
namespace Assembly2
{
using Assembly1;
class DerivedClass : BaseClass
{
void Access()
{
// OK, because protected members are accessible from
// derived classes in any assembly
myValue = 10;
}
}
}
Essa acessibilidade entre assemblys é o que distingue protected de private protected (que restringe o acesso ao mesmo assembly), mas é semelhante a protected internal (embora protected internal também permita o acesso ao mesmo assembly de classes não derivadas).
Especificação da linguagem C#
Para obter mais informações, consulte A acessibilidade declarada na Especificação da Linguagem C#. A especificação de idioma é a fonte definitiva para a sintaxe e o uso de C#.