¿Visibilidad predeterminada para clases y miembros de C # (campos, métodos, etc.)?

164

Estoy tratando de encontrar una referencia para la visibilidad predeterminada de varios aspectos de C #. Tipos de clase, campos, métodos, enumeraciones, etc.

¿Puede alguien proporcionar una lista de estos junto con su visibilidad predeterminada (es decir, sin modificador prefijado)?

Ryan Peters
fuente
posible duplicado del modificador de acceso predeterminado en C #
Jeff Sternal
8
No me considero un duplicado ... esa pregunta es específica (¿Qué es el valor por defecto para esto), éste es amplio (¿Cuáles son todos los valores predeterminados?)
WernerCD

Respuestas:

266

Toda la información que está buscando se puede encontrar aquí y aquí (gracias Reed Copsey ):

Desde el primer enlace:

Las clases y estructuras que se declaran directamente dentro de un espacio de nombres (en otras palabras, que no están anidadas dentro de otras clases o estructuras) pueden ser públicas o internas. Interno es el valor predeterminado si no se especifica un modificador de acceso .

...

El nivel de acceso para miembros de clase y miembros de estructura , incluidas las clases y estructuras anidadas, es privado de forma predeterminada .

...

interfaces predeterminadas para acceso interno .

...

Los delegados se comportan como clases y estructuras. De manera predeterminada, tienen acceso interno cuando se declaran directamente dentro de un espacio de nombres y acceso privado cuando se anidan .


Desde el segundo enlace:

Los tipos de nivel superior , que no están anidados en otros tipos, solo pueden tener accesibilidad interna o pública. La accesibilidad predeterminada para estos tipos es interna .

Y para los tipos anidados:

Miembros de accesibilidad de miembros predeterminados
---------- ----------------------------
enumeración pública
clase privada
interfaz pública
estructura privada
Oded
fuente
66
Una buena compilación de la información de Reed, pero olvidó especificar que dichos modificadores de acceso también se aplican a los métodos.
Joel
44
@ Joel ¿Qué quieres decir? Él dice claramente "miembros". Los miembros son datos y comportamiento y, por lo tanto, incluyen métodos.
rism
En caso de que algún desarrollador de vb.net esté viendo esto, vb es diferente. El ámbito predeterminado para los miembros de la clase vb es Public. Enumlos miembros también lo son Public. Probablemente sea menos confuso usar solo un alcance explícito en su caso, ya que hay muchas posibilidades de que los desarrolladores de c # lo traduzcan o lean en algún momento. La generación de código en vb.net no hace esto por usted, desafortunadamente.
toddmo
Agregaré que una interfaz anidada dentro de una clase es privada, no interna, por defecto.
Frank Bryce
13

De MSDN:

Tipos de alto nivel , que no están anidados en otros tipos, sólo pueden tener internalo publicaccesibilidad. La accesibilidad predeterminada para estos tipos es internal.


Los tipos anidados , que son miembros de otros tipos, pueden tener accesibilidad declarada como se indica en la siguiente tabla.

Accesibilidad predeterminada para miembros anidados y modificadores de accesibilidad permitidos

Fuente: Niveles de accesibilidad (Referencia de C #) (Diciembre 6 º , 2017)

Nicholas Miller
fuente
9

Por defecto, el modificador de acceso para una clase es internal. Eso significa que se puede acceder a una clase dentro del mismo ensamblado. Pero si queremos que se acceda a la clase desde otros ensamblados, entonces debe hacerse pública.

mrk
fuente
19
Esta información ya estaba presente en las otras respuestas. Solo debe responder una pregunta, especialmente una antigua como esta, cuando tenga información adicional que proporcionar o si cree que las otras respuestas son incorrectas. De todos modos, bienvenido a Stack Overflow.
Gorpik
No es necesario que una clase se haga pública para que otros conjuntos puedan acceder a ella. Uno podría usar la clase InternalsVisibleToAttribute[assembly:InternalsVisibleTo("Friend1b")]
adam
0

Por defecto es private. A menos que estén anidados, las clases lo están internal.

Svisstack
fuente
1
¿no son las enumeraciones públicas por defecto?
Ryan Peters
44
@ Jay: a menos que estén anidados. @ Ryan: No, las enumeraciones no anidadas son internas de forma predeterminada.
Jon Skeet
2
@Ryan: los miembros de Enum son públicos de forma predeterminada, pero la enumeración en sí es interna.
Reed Copsey
@ReedCopsey Pero el libro del que estoy aprendiendo claramente lo dice enum members are private by default, so to use them outside the enum we should declare them as public. ¿Puedes explicar por qué el libro contradice lo que dices? Gracias.
Cualquier libro que el usuario @ user5794376 (claramente una cuenta eliminada) esté leyendo debe recibir todas las reseñas de 1 estrella si lo que dicen que está en el libro es cierto. Basta mirar Microsoft Docs para saber que los miembros de enumeración son públicos de forma predeterminada y es por eso que es una práctica común que las enumeraciones solo no sean explícitas en ellas.
Rodney S. Foley