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
oustruct
pode acessar este membro. - protegido: Somente o código no mesmo
class
ou em um derivadoclass
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.
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 várias declarações para a classe ou método parcial declaram acessibilidades diferentes.
Acessibilidade de classe e estrutura
Classes e structs declaradas diretamente em um namespace (não estão aninhadas em outras classes ou structs) podem ter public
ou internal
file
acesso. internal
é o padrão se nenhum modificador de acesso for especificado.
Os membros struct, incluindo classes aninhadas e structs, podem ser declarados public
, internal
ou private
. Os membros da classe, incluindo classes aninhadas e structs, podem ser public
, protected internal
, protected
, internal
, private protected
ou 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 A
interna. 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 internal
ou 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 public
seja . 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.
O file
modificador de acesso é permitido somente em declarações de tipo de nível superior (não aninhadas).
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#.