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
oustruct
. - protected: o tipo ou membro pode ser acessado somente pelo código na mesma
class
ou em umaclass
derivada dessaclass
. - 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 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.
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
Comentários
Enviar e exibir comentários de