Compartilhar via


protected (Referência de C#)

A palavra-chave protected é um modificador de acesso de membro.

Observação

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

Você pode acessar um membro protegido em 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.

A linguagem C# faz referência a documentos da versão mais recentemente lançada da linguagem C#. Ele também contém a documentação inicial para funcionalidades em pré-visualizações públicas para o próximo lançamento do idioma.

A documentação identifica qualquer recurso introduzido pela primeira vez nas três últimas versões do idioma ou nas versões prévias públicas atuais.

Dica

Para descobrir quando um recurso foi introduzido pela primeira vez em C#, consulte o artigo sobre o histórico de versão da linguagem C#.

Você pode acessar um membro protegido de uma classe base em uma classe derivada somente 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). Você só pode acessar membros protegidos 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. Diferentemente protected internaldisso, ele não permite o acesso de classes não derivadas dentro do mesmo assembly.

Você não pode declarar membros struct como protegidos porque structs não podem ser herdados.

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 retornará 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 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