¿Cuál es el modificador de acceso predeterminado para clases, métodos, miembros, constructores, delegados e interfaces?¿Cuáles son los modificadores de acceso predeterminados en C#?
Respuesta
El valor por defecto de acceso para todo en C# es "el acceso más restringido que podría declarar para ese miembro".
Así, por ejemplo:
namespace MyCompany
{
class Outer
{
void Foo() {}
class Inner {}
}
}
es equivalente a
namespace MyCompany
{
internal class Outer
{
private void Foo() {}
private class Inner {}
}
}
El tipo de excepción a esto está haciendo una parte de una propiedad (por lo general el colocador) más restringida que la accesibilidad declarada de la propiedad en sí:
public string Name
{
get { ... }
private set { ... } // This isn't the default, have to do it explicitly
}
Esto es lo que la especificación de C# 3.0 tiene que decir (sección 3.5.1):
Dependiendo del contexto en el que una declaración miembro lleva a cabo, sólo se permiten ciertos tipos de declarada accesibilidad. Además, cuando una declaración de miembro no incluye ningún modificador de acceso, el contexto en el que tiene lugar la declaración determina la accesibilidad declarada predeterminada.
- Los espacios de nombres tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en las declaraciones de espacio de nombres .
- Los tipos declarados en unidades de compilación o espacios de nombres pueden tener pública o accesibilidad interna declarada y por defecto a accesibilidad interna declarada.
- Los miembros de la clase pueden tener cualquiera de los cinco tipos de accesibilidad declarada y de forma predeterminada a la accesibilidad declarada privada . (Tenga en cuenta que un tipo declara como un miembro de una clase puede tener cualquiera de los cinco tipos de declarada accesibilidad, mientras que un tipo declarado como miembro de un espacio de nombres puede tener única pública o interna declarada accesibilidad.)
- Los miembros de Struct pueden tener acceso público, interno o privado declarado y acceso predeterminado a privado declarado porque las estructuras están implícitamente selladas. Los miembros de estructura introducidos en una estructura (es decir, no heredada por esa estructura) no pueden tener protegido o protegido interno declarado acceso. (Tenga en cuenta que un tipo declarada como miembro de una estructura puede tener accesibilidad pública, interna o privada declarada, mientras que un tipo declara como un miembro de un espacio de nombres sólo puede tener acceso público o interno declarado.)
- Los miembros de la interfaz implícitamente tienen acceso público declarado. No se permiten modificadores de acceso en declaraciones de miembro de interfaz .
- Los miembros de enumeración tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en declaraciones de miembros de enumeración.
(Tenga en cuenta que los tipos anidados caerían bajo los "miembros de la clase" o "miembros de la estructura" partes -. Y por lo tanto de forma predeterminada visibilidad privada)
top level class: internal
method: private
members (unless an interface or enum): private (including nested classes)
members (of interface or enum): public
constructor: private (note that if no constructor is explicitly defined, a public default constructor will be automatically defined)
delegate: internal
interface: internal
explicitly implemented interface member: public!
ya esto es lo que quiero gracias Mr.John Buchanana –
Esto no quiere dejar claro que si una clase es también un miembro (debido a ser un tipo anidado), entonces el valor predeterminado es privado. Además, los miembros de una interfaz y una enumeración son siempre públicos. –
¿Solo agrega las palabras "nivel superior" antes de "clase" y las clases anidadas estarán cubiertas por "miembros"? – Draemon
Tenga una mirada en Access Modifiers (C# Programming Guide)
clase y Struct Accesibilidad
interno es el valor por defecto si no se especifica el acceso modificador.clase y Struct miembro de Accesibilidad
miembros de la Clase (incluyendo clases anidadas y estructuras) se pueden declarar con cualquiera de los cinco tipos de acceso. Los miembros de Struct no pueden declararse como protegidos porque las estructuras no son compatibles con la herencia.La accesibilidad de un miembro de puede no ser mayor que el accesibilidad de su tipo que contiene
operadores definidos por el usuario siempre deben ser declarados como pública. Para obtener más información sobre , consulte al operador (C# Referencia).
Destructores no pueden tener accesibilidad modificadores.
Otros Tipos
interfaces declaradas directamente con un espacio de nombres pueden ser declaradas como pública o interna y como clases y las estructuras, interfaces por defecto para el acceso interno. Los miembros de enumeración son siempre públicos, y no se pueden aplicar modificadores de accesoDe forma predeterminada, los delegados tienen acceso interno .
Este bit me concierne: "La accesibilidad de un miembro nunca puede ser mayor que la accesibilidad de su tipo contenedor" - considere la 'clase interna Foo: IDisposable {public void Dispose() { }} '. Además, "de forma predeterminada, los delegados tienen acceso interno" es incorrecto: si se declaran dentro de un tipo, serán privados. Del mismo modo "Internal es el valor predeterminado si no se especifica ningún modificador de acceso" solo es cierto para los tipos de nivel superior. –
Esto es de la documentación de MS, pero gracias de todos modos X-) –
Downvoted por la inexactitud, aunque, por supuesto, es la página la que realmente tiene la culpa: no se debía saber que MSDN no sería digno de confianza en este frente. Veré si la especificación de C# tiene un bit similar para citar. –
nivel de espacio de nombres: internal
nivel Tipo: private
@leppie: ¿podría darnos un ejemplo de qué es el nivel de espacio de nombres frente al nivel de tipo? –
Nivel de espacio de nombres, cosa que puede declarar en un espacio de nombres. Escriba el nivel, las cosas que puede declarar en un tipo. – leppie
Miembros de una interfaz? –
interna es el modificador por defecto
Respuesta corta: mínimo acceso posible (consulte la respuesta de Jon Skeet).
Respuesta larga:
no anidados tipos, enumeración y delegado accesibilidades (sólo se puede tener acceso interno o público)
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | internal | public, internal class | internal | public, internal struct | internal | public, internal delegate | internal | public, internal
Nes Ted tipo y miembro de accessiblities
| Default | Permitted declared accessibilities ------------------------------------------------------------------ namespace | public | none (always implicitly public) enum | public | none (always implicitly public) interface | public | none class | private | All¹ struct | private | public, internal, private² delegate | private | All¹ constructor | private | All¹ interface member | public | none (always implicitly public) method | private | All¹ field | private | All¹ user-defined operator| none | public (must be declared public)
¹ Todo === pública, protegida, interna, privada, interna protegida
² estructuras no pueden heredar de estructuras o clases (por más que puedan, las interfaces) , por lo tanto protegido no es un modificador válido
La accesibilidad de un tipo anidado depende de su dominio de accesibilidad, que está determinado por la accesibilidad declarada de la memb er y el dominio de accesibilidad del tipo que contiene inmediatamente. Sin embargo, el dominio de accesibilidad de un tipo anidado no puede exceder el del tipo contenedor.
Nota: CIL también tiene la provisión para protegida e interna (en contraposición al protegidas existentes "o" interna), pero que yo sepa esto no está actualmente disponible para su uso en C#.
Ver:
http://msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
http://msdn.microsoft.com/en-us/library/ms173121.aspx
http://msdn.microsoft.com/en-us/library/cx03xt0t.aspx
(Hombre que yo amo ... Microsoft URI)
Tengo una pequeña confusión sobre enum. Aunque público es correcto, pero creo que el modificador de acceso predeterminado es interno. La clase – dotnetstep
me gustaría añadir un poco de enlace de documentación. Ver más detalles here.
es por defecto interna y no privada. – Baahubali
¿Dónde escribí la clase es privada? – UnKnown
Esta tabla es válida solo para tipos anidados. La clase – BlueSilver
- 1. ¿Cuáles son los repositorios predeterminados de leiningen?
- 2. ¿Los modificadores de acceso afectan el rendimiento?
- 3. ¿Cuáles son los valores predeterminados para @property en iOS?
- 4. ¿Cuáles son los sitios de actualización de Eclipse predeterminados?
- 5. ¿Cuáles son los directorios de inclusión predeterminados de GCC?
- 6. ¿Cuáles son todos los tipos de empaque maven predeterminados?
- 7. Modificadores de acceso en miembros de la interfaz en C#
- 8. ¿Qué son los modificadores transitorios y volátiles? -
- 9. ¿Cuáles son los valores de color predeterminados para el tema Holo en Android 4.0?
- 10. ¿Cuáles son los valores RGB de los colores de acento predeterminados en Windows Phone 7?
- 11. ¿Cuál es la diferencia entre los especificadores de acceso y los modificadores de acceso?
- 12. ¿Los niveles de acceso y modificadores (privados, sellados, etc.) cumplen una función de seguridad en C#?
- 13. ¿Cuáles son los especificadores de acceso disponibles en C#? ¿Cuál es el predeterminado?
- 14. En Eclipse, ¿cómo cambio los modificadores predeterminados en la plantilla de clase/tipo?
- 15. Cambiar los modificadores de acceso de controles ASP.NET
- 16. ¿Cuáles son los valores predeterminados para Binding.Mode = Default para los controles de WPF?
- 17. Modificadores de acceso de refactor automáticos
- 18. ¿Cuáles son los tipos de devolución de operadores en C++?
- 19. ¿Cuáles son los requisitos para los parámetros de plantilla C++?
- 20. ¿Los modificadores de acceso también afectan la reflexión?
- 21. ¿Cuáles son los usos de funciones virtuales puras en C++?
- 22. ¿Cuáles son todos los usos de '@' en C#?
- 23. ¿Cuáles son los peligros de ADL?
- 24. ¿Cuáles son los oyentes predeterminados en TestNG y dónde encuentro esta lista?
- 25. Archivos de firma y modificadores de acceso en F #
- 26. ¿por qué los argumentos predeterminados son los finales?
- 27. Scala: configuración de prueba unitaria (¿usar modificadores de modificadores de acceso?)
- 28. ¿Cuáles son los valores predeterminados para Rails 3 para: dependiente de has_many y belongs_to
- 29. ¿Cuáles son los estándares de "formateo" de C#?
- 30. ¿Cuáles son los valores predeterminados para las opciones de arco y código cuando se usa nvcc?
"el acceso más restringido que podría declarar para ese miembro" ... no es cierto para los constructores, ya que el acceso más restringido es privado, pero el predeterminado está protegido. –
@ZaidMasud: No, no lo es. Si declara un constructor y no especifica una accesibilidad, será privado. Ver la sección 10.3.5 de la especificación de C#. –
Gracias echaremos un vistazo ...Estaba (erróneamente) asumiendo que la respuesta de John Buchanan a continuación era correcta. –