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:

  • public: o tipo ou membro pode ser acessado por qualquer outro código no mesmo assembly ou em outro assembly que faz referência a ele. O nível de acessibilidade de membros públicos de um tipo é controlado pelo nível de acessibilidade do próprio tipo.
  • private: o tipo ou membro pode ser acessado somente pelo código na mesma class ou struct.
  • protected: o tipo ou membro pode ser acessado somente pelo código na mesma class ou em uma class derivada dessa class.
  • internal: o tipo ou membro pode ser acessado por qualquer código no mesmo assembly, mas não de outro assembly. Em outras palavras, tipos ou membros internal podem ser acessados no código que faz parte da mesma compilação.
  • protected internal: o tipo ou membro pode ser acessado por qualquer código no assembly no qual ele é declarado ou de uma class derivada em outro assembly.
  • private protected: o tipo ou membro pode ser acessado por tipos derivados do class, que são declarados no assembly relativo.

Tabela de resumo

Local do chamador public protected internal protected internal private protected private
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 de um membro de tipo é restrita pela acessibilidade do tipo de conteúdo.

Acessibilidade de classe, registro e struct

As classes, os registros e os structs declarados em um namespace (em outras palavras, que não estão aninhadas em outras classes ou structs) podem ser public ou internal. 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. Tipos aninhados privados não são acessíveis de fora do tipo relativo.

As classes e registros derivados não podem ter uma acessibilidade maior do que os 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.

Acessibilidade de membro de classe, registro e struct

Os membros de classe e de registro (incluindo as classes, os registros e os structs aninhados) 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 interna pode ser acessível de fora do assembly se o membro implementa os métodos de interface ou substitui os métodos virtuais que são 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.

Os finalizadores não podem ter modificadores de acessibilidade.

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

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 membro da interface podem incluir qualquer modificador de acesso. Isso é mais útil para que os métodos estáticos forneçam as implementações comuns necessárias para todos os implementadores de uma classe.

Membros de enumeração sempre são public e nenhum modificador de acesso pode ser aplicado.

Delegados se comportam como classes e structs. Por padrão, eles têm acesso internal quando declarados diretamente dentro de um namespace e acesso private quando aninhados.

Tabela de resumo de acesso padrão

Tipo Acesso padrão
class interno
struct interno
interface interno
record interno
enum interno
Membros interface público
classe, registro e estrutura private

Para obter mais detalhes, consulte a página Níveis de Acessibilidade.

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