Share via


Modificadores de acesso (Guia de programação em C#)

Todos os tipos e membros do tipo têm um nível de acessibilidade. O nível de acessibilidade controla se eles podem ser usados a partir de outro código em seu assembly ou outros assemblies. Um assembly é um .dll ou .exe criado compilando um ou mais arquivos .cs em uma única compilação. Use os seguintes modificadores de acesso para especificar a acessibilidade de um tipo ou membro ao declará-lo:

  • public: Código em qualquer assembly pode acessar este tipo ou membro. O nível de acessibilidade do tipo que contém controla o nível de acessibilidade dos membros públicos do tipo.
  • private: Somente código declarado no mesmo class ou struct pode acessar este membro.
  • protegido: Somente o código no mesmo class ou em um derivado class pode acessar este tipo ou membro.
  • interno: Somente o código no mesmo assembly pode acessar esse tipo ou membro.
  • interno protegido: Somente o código no mesmo assembly ou em uma classe derivada em outro assembly pode acessar esse tipo ou membro.
  • private protected: Somente o código no mesmo assembly e na mesma classe ou uma classe derivada pode acessar o tipo ou membro.
  • file: Somente o código no mesmo arquivo pode acessar o tipo ou membro.

O record modificador em um tipo faz com que o compilador sintetize membros extras. O record modificador não afeta a acessibilidade padrão para um record class ou um record struct.

Quadro-resumo

Localização do chamador public protected internal protected internal private protected private file
Dentro do ficheiro ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Dentro da classe ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Classe derivada (mesma montagem) ✔️ ✔️ ✔️ ✔️ ✔️
Classe não derivada (mesma montagem) ✔️ ✔️ ✔️
Classe derivada (montagem diferente) ✔️ ✔️ ✔️
Classe não derivada (montagem diferente) ✔️

Os exemplos a seguir demonstram como especificar modificadores de acesso em um tipo e membro:

public class Bicycle
{
    public void Pedal() { }
}

Nem todos os modificadores de acesso são válidos para todos os tipos ou membros em todos os contextos. Em alguns casos, a acessibilidade do tipo de contenção restringe a acessibilidade de seus membros.

Quando uma declaração de uma classe parcial ou método parcial não declara sua acessibilidade, ela tem a acessibilidade da outra declaração. O compilador gera um erro se várias declarações para a classe ou método parcial declaram acessibilidades diferentes.

Acessibilidade de classe e estrutura

As classes e estruturas declaradas diretamente em um namespace (não estão aninhadas em outras classes ou structs) podem ser ou publicinternal. internal é o padrão se nenhum modificador de acesso for especificado.

Os membros struct, incluindo classes aninhadas e structs, podem ser declarados public, internalou private. Os membros da classe, incluindo classes aninhadas e structs, podem ser public, protected internal, protected, internal, private protectedou private. Membros de classe e struct, incluindo classes aninhadas e structs, têm private acesso por padrão.

As classes derivadas não podem ter maior acessibilidade do que seus tipos básicos. Não é possível declarar uma classe B pública que deriva de uma classe Ainterna. Se permitido, teria o efeito de tornar A público, porque todos ou internal membros protected de são acessíveis a partir da A classe derivada.

Você pode habilitar outros assemblies específicos para acessar seus tipos internos usando o InternalsVisibleToAttribute. Para obter mais informações, consulte Assemblies de amigos.

Outros tipos

As interfaces declaradas diretamente dentro de um namespace podem ser public ou internal e, assim como classes e structs, interfaces padrão para internal acesso. Os membros da interface são public por padrão porque o objetivo de uma interface é permitir que outros tipos acessem uma classe ou struct. As declarações de membro da interface podem incluir qualquer modificador de acesso. Você usa modificadores de acesso em interface membros para fornecer uma implementação comum necessária para todos os implementadores de uma interface.

Um delegate tipo declarado diretamente em um namespace tem internal acesso por padrão.

Para obter mais informações sobre modificadores de acesso, consulte a página Níveis de acessibilidade .

Acessibilidade para membros

Os membros de um ou struct (incluindo classes aninhadas e structs) podem ser declarados com qualquer um class dos seis tipos de acesso. Os membros struct não podem ser declarados como protected, protected internalou private protected porque structs não suportam herança.

Normalmente, a acessibilidade de um membro não é maior do que a acessibilidade do tipo que o contém. No entanto, um public membro de uma internal classe pode ser acessível de fora do assembly se o membro implementa métodos de interface ou substitui métodos virtuais que são definidos em uma classe base pública.

O tipo de qualquer campo, propriedade ou evento de membro deve ser pelo menos tão acessível quanto o próprio membro. Da mesma forma, o tipo de retorno e os tipos de parâmetro de qualquer método, indexador ou delegado devem ser pelo menos tão acessíveis quanto o próprio membro. Por exemplo, você não pode ter um public método M que retorna uma classe C , a menos C que também publicseja . Da mesma forma, você não pode ter uma protected propriedade do tipo A se A for declarada como private.

Os operadores definidos pelo utilizador devem ser sempre declarados como public e static. Para obter mais informações, consulte Sobrecarga do operador.

Para definir o nível de acesso para um class ou struct membro, adicione a palavra-chave apropriada à declaração de membro, conforme mostrado no exemplo a seguir.

// public class:
public class Tricycle
{
    // protected method:
    protected void Pedal() { }

    // private field:
    private int _wheels = 3;

    // protected internal property:
    protected internal int Wheels
    {
        get { return _wheels; }
    }
}

Os finalizadores não podem ter modificadores de acessibilidade. Os membros de um enum tipo são sempre public, e nenhum modificador de acesso pode ser aplicado.

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

Consulte também