Compartilhar via


protected (Referência de C#)

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#.

Consulte também