Partilhar via


protegido (Referência C#)

A protected palavra-chave é um modificador de acesso a membros.

Observação

Este artigo aborda protected o acesso. A palavra-chave protected também faz parte dos modificadores de acesso protected internal e private protected.

Pode aceder a um membro protegido dentro da sua classe e por instâncias de classe derivadas.

Para obter uma comparação com os outros modificadores de acesso, consulte Níveis de 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#.

Só pode aceder a um membro protegido de uma classe base numa classe derivada se o acesso ocorrer através 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 is of type BaseClass). Só pode aceder a membros protegidos através do tipo de classe derivado 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, não permite o acesso de classes não derivadas dentro do mesmo assembly.

Não podes declarar os membros da struct como protegidos porque as structs não podem ser herdadas.

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 alterar os níveis de acesso de x e y para privado, o compilador devolve as mensagens de erro:

'Point.y' is inaccessible due to its protection level.

'Point.x' is inaccessible due to its protection level.

O exemplo a seguir demonstra que protected os membros 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 montagens é 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 Acessibilidade declarada na Especificação de linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso do C#.

Ver também