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
oustruct
pode acessar este membro. - protegido: Somente código no mesmo
class
ou em umclass
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 internal
de 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#.