Partilhar 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 outro código na sua assembleia ou outras assembleias pode usá-los. 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.

Use o modificador de ficheiro para tipos de nível superior (não aninhados). O file modificador restringe o acesso ao código no mesmo ficheiro fonte. Não podes combinar o file modificador com nenhum modificador de acesso.

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

Várias declarações de uma classe parcial ou membro parcial devem ter a mesma acessibilidade. Se uma declaração não incluir um modificador de acesso, as outras declarações não podem declarar um modificador de acesso. 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

Classes e structs declarados diretamente num namespace (que não estão aninhados em outras classes ou structs) podem ter public ou internal acesso. Se não especificar um modificador de acesso, o predefinido é internal. Também pode usar o file modificador para restringir o acesso ao ficheiro fonte atual.

Pode declarar membros de estrutura, incluindo classes e estruturas aninhadas, como public, internal, ou private. Pode declarar membros da classe, incluindo classes aninhadas e structs, como public, protected internal, protected, internal, private protected ou private. Por defeito, os membros de classe e estruturas, incluindo classes e estruturas aninhadas, têm acesso private.

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 protected membros internal 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

Pode declarar interfaces diretamente dentro de um namespace como public ou internal. Tal como as classes e structs, as interfaces têm um internal de acesso por defeito. 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. Use modificadores de acesso nos interface membros para fornecer uma implementação comum necessária a 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

Podes declarar membros de um class ou struct (incluindo classes aninhadas e structs) com qualquer um dos seis tipos de acesso. Não podes declarar membros das strucs como protected, protected internal, ou private protected porque as estruturas 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, pode aceder a um public membro de uma internal classe fora da assembly se o membro implementar métodos de interface ou sobrepor métodos virtuais definidos numa 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.

Deve sempre declarar os operadores definidos pelo utilizador como public. 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 => _wheels;
}

Os finalizadores não podem ter modificadores de acessibilidade. Os membros de um enum tipo são sempre public, e não podes aplicar modificadores de acesso.

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