Visibilidade padrão para classes e membros de C # (campos, métodos etc.)?


164

Estou tentando encontrar uma referência para a visibilidade padrão de vários aspectos do c #. Tipos de classe, campos, métodos, enumerações, etc.

Alguém pode fornecer uma lista desses, juntamente com sua visibilidade padrão (ou seja, nenhum modificador prefixado)?



8
Eu não considero isso uma duplicata ... essa pergunta é específica (O que é o padrão para isso), este é ampla (que são todos os padrões?)
WernerCD

Respostas:


266

Todas as informações que você procura podem ser encontradas aqui e aqui (obrigado Reed Copsey ):

Do primeiro link:

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

...

O nível de acesso para membros da classe e membros da estrutura , incluindo classes e estruturas aninhadas, é privado por padrão .

...

interfaces padrão para acesso interno .

...

Os delegados se comportam como classes e estruturas. Por padrão, eles têm acesso interno quando declarado diretamente em um espaço para nome e acesso privado quando aninhado .


No segundo link:

Os tipos de nível superior , que não estão aninhados em outros tipos, podem ter apenas acessibilidade interna ou pública. A acessibilidade padrão para esses tipos é interna .

E para tipos aninhados:

Membros de acessibilidade de membro padrão
---------- ----------------------------
enum public
aula particular
interface pública
struct private

6
Uma boa compilação das informações de Reed, mas você esqueceu de especificar que esses modificadores de acesso também se aplicam aos métodos.
Joel

4
@Joel O que você quer dizer? Ele afirma claramente "membros". Membros sendo dados e comportamento e, portanto, incluindo métodos.
RISM

Caso algum desenvolvedor do vb.net esteja olhando para isso, o vb é diferente. O escopo padrão para os membros da classe vb é Public. Enumos membros também são Public. Provavelmente menos confuso usar apenas o escopo explícito no seu caso, já que as chances são altas, elas serão traduzidas ou lidas pelos desenvolvedores do c # em algum momento. Infelizmente, a geração de código no vb.net não faz isso por você.
toddmo

Acrescentarei que uma interface aninhada dentro de uma classe é privada, não interna, por padrão.
Frank Bryce

13

Do MSDN:

Os tipos de nível superior , que não estão aninhados em outros tipos, podem ter apenas internalou publicacessibilidade. A acessibilidade padrão para esses tipos é internal.


Tipos aninhados , que são membros de outros tipos, podem ter acessibilidades declaradas, conforme indicado na tabela a seguir.

Acessibilidade de membro aninhado padrão e modificadores de acessibilidade permitidos

Fonte: Níveis de Acessibilidade (C # Referência) (6 de dezembro th , 2017)


9

Por padrão, o modificador de acesso para uma classe é internal. Isso significa dizer que uma classe é acessível dentro da mesma montagem. Mas se queremos que a classe seja acessada de outras assembléias, ela deve ser tornada pública.


19
Esta informação já estava presente nas outras respostas. Você só deve responder a uma pergunta, especialmente uma antiga como essa, quando tiver informações adicionais a fornecer ou se achar que as outras respostas estão erradas. De qualquer forma, bem-vindo ao Stack Overflow.
Gorpik

Uma classe não precisa necessariamente ser tornada pública para ser acessível a outras assembléias. Pode-se usar a classe InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam

0

Por padrão é private. A menos que estejam aninhados, as classes são internal.


1
as enums não são públicas por padrão?
Ryan Peters

4
@ Jay: A menos que estejam aninhados. @Ryan: Não, as enumerações não aninhadas são internas por padrão.
Jon Skeet

2
@Ryan: os membros da enum são públicos por padrão, mas a enum em si é interna.
Reed Copsey

@ReedCopsey Mas o livro de que estou aprendendo diz isso claramente enum members are private by default, so to use them outside the enum we should declare them as public. Você pode explicar por que o livro contradiz o que você diz? Obrigado.

Qualquer livro que o usuário @ user5794376 (claramente uma conta excluída) esteja lendo deve receber todas as resenhas de 1 estrela se o que eles dizem que está no livro for verdadeiro. Basta olhar para o Microsoft Docs para saber que os membros da enum são públicos por padrão e é por isso que é prática comum que as enum não sejam explícitas neles.
Rodney S. Foley
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.