¿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)?



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

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)


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.


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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.