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

Todos os tipos e membros de tipo têm um nível de acessibilidade. O nível de acessibilidade controla se eles podem ser usados em outro código no assembly ou em outros assemblies. Um assembly é um .dll ou .exe criado ao selecionar um ou mais arquivos .cs em uma única compilação. Use os modificadores de acesso a seguir para especificar a acessibilidade de um tipo ou membro quando você o declarar:

  • público: O código em qualquer assembly pode acessar esse 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.
  • privado: Somente o código declarado no mesmo class ou struct pode acessar este membro.
  • protegido: Somente código no mesmo class ou em um class derivado pode acessar esse tipo ou membro.
  • interno: Somente código no mesmo assembly pode acessar esse tipo ou membro.
  • interno protegido: Somente código no mesmo assembly ou em uma classe derivada em outro assembly pode acessar esse tipo ou membro.
  • privado protegido: Somente código no mesmo assembly e na mesma classe ou em uma classe derivada pode acessar o tipo ou membro.
  • arquivo: somente o código no mesmo arquivo pode acessar o tipo ou membro.

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

Tabela de resumo

Local do chamador public protected internal protected internal private protected private file
Dentro do arquivo ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️
Dentro da classe ✔️️ ✔️ ✔️ ✔️ ✔️ ✔️
Classe derivada (mesmo assembly) ✔️ ✔️ ✔️ ✔️ ✔️
Classe não derivada (mesmo assembly) ✔️ ✔️ ✔️
Classe derivada (assembly diferente) ✔️ ✔️ ✔️
Classe não derivada (assembly 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 que contém restringe a acessibilidade dos seus membros.

Várias declarações de uma classe parcial ou membro parcial devem ter a mesma acessibilidade. Se uma declaração da classe ou membro parcial não incluir um modificador de acesso, as outras declarações não poderão declarar um modificador de acesso. O compilador gera um erro se múltiplas declarações para a classe ou método parcial declararem acessibilidades diferentes.

Acessibilidade de classe e estrutura

Classes e estruturas declaradas diretamente em um namespace (não estão aninhadas em outras classes ou structs) podem ter acesso public, internal ou file. internal é o padrão, se nenhum modificador de acesso for especificado.

Os membros de struct, incluindo classes e structs aninhados, podem ser declarados como public, internal ou private. Os membros de classe, incluindo classes e structs aninhados, podem ser public, protected internal, protected, internal, private protected ou private. Os membros de classe e struct, incluindo classes e structs aninhados, têm acesso private por padrão.

As classes derivadas não podem ter maior acessibilidade do que seus tipos base. Você não pode declarar uma classe pública B derivada de uma classe interna A. Se permitido, teria o efeito de tornar A público, pois todos os membros protected ou internalde A são acessíveis na classe derivada.

Você pode permitir que outros assemblies específicos acessem os tipos internos usando o InternalsVisibleToAttribute. Para obter mais informações, consulte Assemblies amigáveis.

Outros tipos

As interfaces declaradas diretamente em um namespace podem ser public ou internal e, assim como classes e structs, o padrão das interfaces é o acesso internal. Membros de interface são public por padrão, pois a finalidade de uma interface é permitir que outros tipos acessem uma classe ou um struct. As declarações de membros 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 tipo delegate declarado diretamente em um namespace tem acesso internal por padrão.

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

Acessibilidade de membro

Membros de um class ou struct (incluindo classes e estruturas aninhadas) podem ser declarados com qualquer um dos seis tipos de acesso. Os membros de struct não podem ser declarados como protected, protected internal ou private protected, pois os structs não permitem herança.

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

O tipo de qualquer campo, propriedade ou evento do 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 método public, M, que retorna uma classe C, a menos que C também seja public. Da mesma forma, você não pode ter uma propriedade protected do tipo A, se A for declarada como private.

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

Para definir o nível de acesso para um membro class ou struct, adicione a palavra-chave apropriada à declaração do 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.

O modificador de acesso file é permitido apenas em declarações de tipo de nível superior (não aninhados).

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

Confira também