Modificadores de acesso (Guia de Programação em C#)

Todos os tipos e membros de tipos têm um nível de acessibilidade, que controla se eles podem ser usados a partir de outro código no seu conjunto ou outros assemblies. Você pode usar os seguintes modificadores de acesso para especificar a acessibilidade de um tipo ou membro quando você declara que ele:

  • pública
    O tipo ou membro pode ser acessado por qualquer outro código no mesmo assembly ou outro conjunto que faz referência a ele.

  • Particular
    O tipo ou membro pode ser acessado somente pelo código na mesma classe ou struct.

  • protegido
    O tipo ou membro pode ser acessado somente pelo código na mesma classe ou struct ou em uma classe derivada da classe.

  • interno
    O tipo ou membro pode ser acessado por qualquer código no mesmo assembly, mas não a partir de outro assembly.

  • protected internal
    O tipo ou membro pode ser acessado por qualquer código no assembly no qual ele está declarado ou de uma classe derivada em outro assembly. Acesso a partir de outro assembly deve ocorrer dentro de uma declaração de classe que deriva da classe na qual o elemento interno protegido é declarado e ele deverá ser feita por meio de uma instância do tipo classe derivada.

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 podem ser usados por todos os tipos ou membros em todos os contextos e, em alguns casos a acessibilidade de um membro do tipo é restrito pela acessibilidade do respectivo tipo. As seções a seguir fornecem mais detalhes sobre a acessibilidade.

Classe e a acessibilidade de Struct

Classes e estruturas que são declaradas dentro de um espaço para nome (em outras palavras, que não estão aninhadas dentro de outras classes ou estruturas) podem ser público ou interno. Interno é o padrão se nenhum modificador de acesso for especificado.

Membros de struct, incluindo classes aninhadas e estruturas, podem ser declarados como público, interna ou privada. Os membros, incluindo classes aninhadas e estruturas de classe, pode ser public, protected interno, protegido, interna ou privada. O nível de acesso para membros de classes e membros de struct, incluindo classes aninhadas e estruturas, é particular por padrão. Tipos aninhados particulares não estão acessíveis de fora do tipo recipiente.

Classes derivadas não podem ter maior acessibilidade de seus tipos base. Em outras palavras, você não pode ter uma classe pública B que deriva de uma classe interna A. Se isso eram permitido, ele teria o efeito da tomada de A pública, pois todos os membros protegidos ou internos do A são acessíveis a partir da classe derivada.

Você pode habilitar específico outros assemblies para acessar seus tipos internos usando o InternalsVisibleToAttribute. Para obter mais informações, consulte Assemblies amigáveis (C# e Visual Basic).

Classe e membro da estrutura acessibilidade

Os membros de classe (inclusive estruturas e classes aninhadas) podem ser declarados com qualquer um dos cinco tipos de acesso. Membros de struct não podem ser declarados como protegido porque structs não oferecem suporte a herança.

Normalmente, a acessibilidade de um membro não é maior do que a acessibilidade do tipo que o contém. No entanto, um membro público de uma classe interna pode estar acessível fora do assembly se o membro implementa os métodos de interface ou substitui os métodos virtuais que são definidos na classe base pública.

O tipo de qualquer membro que é um campo, propriedade ou evento 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 membro que é um 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 público M , que retorna uma classe C , a menos que C também é público. Da mesma forma, você não pode ter uma propriedade protegida do tipo A se A é declarado como privado.

Operadores definidos pelo usuário sempre devem ser declarados como públicos. Para obter mais informações, consulte operator (Referência de C#).

Destruidores não podem ter modificadores de acessibilidade.

Para definir o acesso de nível de um membro de class ou struct, adicione a palavra-chave apropriada para a 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; }
    }
}

Dica

O nível de acessibilidade interno protegido significa não protegido ou interno, protected e internal.Em outras palavras, um membro protected internal pode ser acessado de qualquer classe no mesmo assembly, incluindo classes derivadas.Para limitar a acessibilidade para somente as classes derivadas no mesmo assembly, declarar a própria classe interna e declarar seus membros como protegido.

Outros tipos

As interfaces declaradas diretamente dentro de um namespace podem ser declaradas como público ou interno e, assim como classes e estruturas, interfaces padrão para acesso interno. Membros de interface sempre são públicos, pois a finalidade de uma interface é permitir que outros tipos acessar uma classe ou estrutura. Nenhum modificador de acesso pode ser aplicadas a membros de interface.

Os membros da enumeração sempre são públicos e não pode ser aplicado nenhum modificador de acesso.

Delegados se comportam como classes e estruturas. Por padrão, eles têm acesso interno quando declaradas dentro de um espaço para nome e privadas de acesso quando 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#.

Consulte também

Referência

Classes e structs (Guia de Programação em C#)

Interfaces (Guia de Programação em C#)

private (Referência de C#)

public (Referência de C#)

internal (Referência de C#)

protected (Referência de C#)

class (Referência de C#)

struct (Referência de C#)

interface (Referência de C#)

Conceitos

Guia de Programação em C#